在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("添加失敗"); } }