在NuGet程序包中安装MySql.Data
引入命名空间
using MySql.Data.MySqlClient;
using System.Configuration;
在App.config中配置(方便更改连接)
<connectionStrings>
<add name ="connStr" connectionString="server=localhost;port=3306;user=root;password=123456; database=testdb" providerName="MySql.Data.MySqlClient"/>
</connectionStrings>
使用 MySqlCommand(数据不会存储,需要定义一个数组手动存储)
string connetStr = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString; try { using (MySqlConnection conn = new MySqlConnection(connetStr)) //写在using(){}内会自动释放Dispose,可以省略x.Close() { conn.Open(); Console.WriteLine("连接数据库"); //在这里使用代码对数据库进行增删查改 string sql = "select * from tb_user where id=@id;";//创建命令,使用Parameters对象方法可防止SQL注入等问题 MySqlCommand cmd = new MySqlCommand(sql,conn); cmd.Parameters.AddWithValue("@id",4); //传单个参数 /* "select * from tb_user where id>@id and age>@age;" MySqlParameter[] paras = //传多个参数 { new MySqlParameter("@id", 1), new MySqlParameter("@age", 18) } cmd.Parameters.AddRange(paras); */ //cmd.CommandType = CommandType.StoredProcedure;//如果是存储过程,必须设置。(需引入命名空间 using System.Data;) int count = cmd.ExecuteNonQuery();//返回受影响的行数,适用于增删改,返回的数据为int类型 object es = cmd.ExecuteScalar();//返回查询结果第一条数据的第一个字段,适用于查询有多少条数据,返回的数据为object类型 MySqlDataReader dr = cmd.ExecuteReader(); //只读,使用于只读取数据不修改的情况且数据量比较小的情况 if (dr.HasRows)//判断是否有数据 { string idName = dr.GetName(0); //通过列号获取列名 int indexId = dr.GetOrdinal("id"); //通过列名获取列号 int indexName = dr.GetOrdinal("name"); int indexAge = dr.GetOrdinal("age"); while (dr.Read()) { //建议通过list集合来自定义一个类型,用来存储获取到的数据
//int id = (int)dr["id"];此方法会频繁拆箱装箱消耗性能,建议使用下面的方法 int id = dr.GetInt32(indexId); //通过列号获取数据 string name = dr.GetString(indexName); int age = dr.GetInt32(indexAge); string str = "用户id:" + id + ",用户名:" + name + ",用户年龄:" + age + ""; Console.WriteLine(str); } } dr.Close(); //需要手动关闭,在using(){}中使用时可以省略 } } catch(MySqlException ex) { Console.WriteLine(ex.Message); switch (ex.Number) { case 0: Console.WriteLine("无法连接到服务器"); break; case 1045: Console.WriteLine("账号密码错误"); break; } } finally { Console.WriteLine("关闭数据库"); }
使用适配器 MySqlDataAdapter(将数据存储到内存中,占用内存)
string connetStr = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString; MySqlConnection conn = new MySqlConnection(connetStr); string sql = "select * from tb_user where id>@id"; MySqlCommand cmd = new MySqlCommand(sql, conn); cmd.Parameters.AddWithValue("@id", 2); //使用MySqlDataAdapter可省略conn.Open(),conn.Close(),在方法内部会自动调用 MySqlDataAdapter da = new MySqlDataAdapter(cmd); da.TableMappings.Add("Table", "User"); //设置表名映射 DataTable dt = new DataTable(); //需引入命名空间using System.Data; da.Fill(dt); //将dt表存储到内存中 dt.Rows[0]["name"] = "abc";//修改dt表第一列name字段的数据 DataRow dr = dt.NewRow();//增加新数据 dr["id"] = 6; dr["name"] = "张三"; dr["age"] = 15; dt.Rows.Add(dr); MySqlCommandBuilder cmdBuilder = new MySqlCommandBuilder(da); //自动为da配置命令 da.Update(dt); //更新到数据库中
使用事务 BeginTransaction(此方法用来批量执行一组命令,一个命令错误就会全部回滚,防止误提交问题)
string connStr = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString; using (MySqlConnection conn = new MySqlConnection(connStr)) { MySqlTransaction tran = null; try { conn.Open(); tran = conn.BeginTransaction(); //开启一个事务 MySqlCommand cmd = conn.CreateCommand(); cmd.Transaction = tran; //设置要执行的事务 //定义要执行的操作 cmd.CommandText = "insert into tb_user (id,name,age,time) values(@id,@name,@age,@time);select @@identity"; MySqlParameter[] pares = { new MySqlParameter("@id",10), new MySqlParameter("@name","李四"), new MySqlParameter("@age",25), new MySqlParameter("@time",DateTime.Now) }; cmd.Parameters.AddRange(pares); cmd.ExecuteScalar(); cmd.Parameters.Clear(); //清空命令集合
//执行下一个命令
cmd.CommandText = "select * from tb_user";
cmd.ExecuteScalar();
cmd.Parameters.Clear();
//下一个命令......
tran.Commit();//事务提交 Console.WriteLine("用户添加成功"); } catch (MySqlException ex) { tran.Rollback();//事务回滚 Console.WriteLine(ex.Message); Console.WriteLine("添加失败"); } }
