mysql数据通讯方式_c# 与 Mysql 的通讯方式总结
兩種開發(fā)方式
1.使用 vs 自帶的可視化工具,不推薦。
在 vs 的項(xiàng)目中添加 ‘?dāng)?shù)據(jù)集’,然后通過可視化的工具添加數(shù)據(jù)庫為數(shù)據(jù)源,默認(rèn)可添加 SQL Server 和 Oracle 等,添加 Mysql 前需要額外安裝組件。
優(yōu)點(diǎn),自帶 sql 語句中特殊字符的轉(zhuǎn)義,不會出現(xiàn) sql 注入的問題,配合數(shù)據(jù)綁定可以在項(xiàng)目前期快速推進(jìn)項(xiàng)目進(jìn)度。
缺點(diǎn):可視化工具的使用并不流行,不利于開發(fā)團(tuán)隊(duì)的招募和項(xiàng)目后期的修改維護(hù)。許多常用的功能很難使用,如:存儲過程,事務(wù),連接池控制等。
2.引用 mysql.data.dll ,在此基礎(chǔ)上進(jìn)行開發(fā),推薦。
完全由代碼完成通訊過程。
優(yōu)點(diǎn):可以方便的使用各種功能,
缺點(diǎn):需要手寫代碼,開發(fā)速度稍慢。
完整的通訊過程
1.建立連接,連接分 “長連接” 和 “短連接”
長連接在高頻次的通訊時(shí)快速高效,但是占用資源,在并發(fā)訪問下容易耗盡網(wǎng)絡(luò)資源,對于帶寬較低的局域網(wǎng)來說,如果大量使用長連接,會占用網(wǎng)速,影響使用體驗(yàn)。
短連接在使用時(shí) open, 使用完成后 close,此時(shí)連接資源會進(jìn)入連接池,等待下次連接時(shí)使用。雖然資源未被釋放掉,但連接池的開銷不大,是完全可以接受的。短連接一樣需要考慮并發(fā)問題。
短連接在使用完成后可以直接 dispose,或者使用 using(){} 來限定連接的作用域,使用完成后自動釋放掉,不進(jìn)入連接池,這種方式資源占用最少,但在需要反復(fù)建立連接的情況下連接效率較低。
在實(shí)際開發(fā)的時(shí)候最好使用短連接,并在使用結(jié)束后關(guān)閉并放入連接池。
string connStr = "server=127.0.0.1; port=3306; user id=user1; Password=pass1; database=data1; pooling = true";
MySqlConnection conn= newMySqlConnection(connStr);
conn.Open();
conn.Close();
2.使用連接創(chuàng)建 sql 命令并執(zhí)行
1.純 sql 語句,執(zhí)行后有三種返回方式:
cmd.ExecuteScalar(); // 查詢結(jié)果僅一行一列,直接接收
string connStr = "server=127.0.0.1; port=3306; user id=user1; Password=pass1; database=data1; pooling = true";
MySqlConnection conn= newMySqlConnection(connStr);
conn.Open();
MySqlCommand cmd=conn.CreateCommand();string name = "Tom";
cmd.CommandText= string.Format("select count(*) from student where Name = '{0}';", name);object obj = cmd.ExecuteScalar(); //可能未nullint count = 0;
if (!obj.Equals(DBNull.Value))
{
count = Convert.ToInt32(obj);}conn.Close();
MySqlDataReader reader = cmd.ExecuteReader();? // 通過 reader 獲得大量數(shù)據(jù)
string connStr = "server=127.0.0.1; port=3306; user id=user1; Password=pass1; database=data1; pooling = true";
MySqlConnection conn= newMySqlConnection(connStr);
conn.Open();
MySqlCommand cmd=conn.CreateCommand();
cmd.CommandText= string.Format("select Name from student;");
MySqlDataReader reader=cmd.ExecuteReader();
List list = new List();while(reader.Read())
{
list.Add(reader.GetString("Name"));
}
reader.Close();
conn.Close();
cmd.ExecuteNonQuery(); // 獲得增刪改語句執(zhí)行后影響的行數(shù)
string connStr = "server=127.0.0.1; port=3306; user id=user1; Password=pass1; database=data1; pooling = true";
MySqlConnection conn= newMySqlConnection(connStr);
conn.Open();
MySqlCommand cmd=conn.CreateCommand();string name = "Tom";
cmd.CommandText= string.Format("update student SET Name='Tommy' where Name = '{0}';", name);int count =cmd.ExecuteNonQuery();
conn.Close();
普通 sql 語句的缺點(diǎn):如果上面例子中的 name 參數(shù)中帶有單引號,整個(gè) sql 語句將執(zhí)行錯(cuò)誤,因?yàn)槲磳μ厥庾址M(jìn)行轉(zhuǎn)義。主要特殊字符有單引號,反斜杠,# 等,而這些特殊字符在不同的使用情況下有時(shí)需要轉(zhuǎn)義,有時(shí)不需要轉(zhuǎn)義。Mysql 提供了類似 QUOTE(str) 這樣的字符串處理函數(shù),但不能完全滿足要求。
這就是 sql 注入,sql 注入的概念網(wǎng)上資料較多,在此不再贅述,而常用的解決方案是采用參數(shù)化的 sql 語句。
2.sql 語句和 sql 參數(shù)
帶有參數(shù)的 sql 語句和 sql 參數(shù)會分開傳入數(shù)據(jù)庫服務(wù)器中,服務(wù)器先將 sql 語句進(jìn)行編譯,然后將 sql 參數(shù)導(dǎo)入編譯后的 sql 語句中(在此過程中自動對特殊字符進(jìn)行轉(zhuǎn)義),從而從根源上防止了 sql 注入的發(fā)生。
string connStr = "server=127.0.0.1; port=3306; user id=user1; Password=pass1; database=data1; pooling = true";
MySqlConnection conn= newMySqlConnection(connStr);
conn.Open();
MySqlCommand cmd=conn.CreateCommand();
cmd.CommandText= "select count(*) from student where Name = @Name;";cmd.Parameters.AddWithValue("@Name", "Tom");
object obj = cmd.ExecuteScalar(); //可能為null int count = 0;if (!obj.Equals(DBNull.Value)) { count=Convert.ToInt32(obj); } conn.Close();
3.DataAdapter
private static void Test(MySqlCommand cmd)
{
//獲取記錄
DataTable dt1 = new DataTable();
cmd.CommandText = "select * from table1;";
MySqlDataAdapter da = new MySqlDataAdapter(cmd);
da.Fill(dt1);
//插入記錄
cmd.CommandText = "select * from pet where 1=0;";
da = new MySqlDataAdapter(cmd);
MySqlCommandBuilder cb = new MySqlCommandBuilder(da);
da.UpdateCommand = cb.GetInsertCommand();
DataTable dt2 = new DataTable();
da.Fill(dt2);
//對dt2進(jìn)行賦值
da.Update(dt2);
}
4.事務(wù)
多條 sql 語句的組合會出現(xiàn)某一條 sql 語句執(zhí)行出錯(cuò),而其他 sql 語句順利執(zhí)行的情況,這可能與預(yù)期不符合。此時(shí)需要使用事務(wù)。
事務(wù)在執(zhí)行出錯(cuò)時(shí)可以回滾。
事務(wù)往往帶有多條 sql 語句,在使用參數(shù)化的 sql 語句時(shí)要注意參數(shù)名稱不能相同。
conn.Open();
MySqlCommand cmd=conn.CreateCommand();
MySqlTransaction myTrans=conn.BeginTransaction();
cmd.Connection=conn;
cmd.Transaction=myTrans;
cmd.CommandText= "";
cmd.ExecuteNonQuery();
myTrans.Commit();
conn.Close();
5.存儲過程
不論是 sql 語句還是事務(wù),在傳輸指令的時(shí)候都需要耗費(fèi)大量的時(shí)間,數(shù)據(jù)庫編譯這些指令也需要耗費(fèi)大量時(shí)間,這不利于高訪問量的數(shù)據(jù)庫的運(yùn)行。
存儲過程是將 sql 指令寫在數(shù)據(jù)庫中,此時(shí)數(shù)據(jù)庫直接完成編譯,與數(shù)據(jù)庫通訊是只需要傳遞參數(shù)即可。節(jié)省了傳輸時(shí)間和編譯時(shí)間。
conn.Open();
MySqlCommand cmd=conn.CreateCommand();
cmd.CommandType=CommandType.StoredProcedure;
cmd.CommandText= "SpFillStudent";
MySqlParameter paraMoney;
paraMoney= cmd.Parameters.Add("@inMoney", MySqlDbType.Decimal);
paraMoney.Direction=ParameterDirection.Input;
paraMoney.Value= 50;
MySqlParameter paraTradeType;
paraTradeType= cmd.Parameters.Add("@inTradeType", MySqlDbType.String);
paraTradeType.Direction=ParameterDirection.Input;
paraTradeType.Value= "會員卡充值";
MySqlParameter paraPayDetailStr;
paraPayDetailStr= cmd.Parameters.Add("@inPayDetailStr", MySqlDbType.String);
paraPayDetailStr.Direction=ParameterDirection.Input;
paraPayDetailStr.Value= "";
MySqlParameter paraOutResult;
paraOutResult= cmd.Parameters.Add("@outResult", MySqlDbType.String);
paraOutResult.Direction=ParameterDirection.Output;
cmd.ExecuteNonQuery();string result = (string)paraOutResult.Value;
conn.Close();
總結(jié)
以上是生活随笔為你收集整理的mysql数据通讯方式_c# 与 Mysql 的通讯方式总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql long raw_读取Ora
- 下一篇: 手写识别底层原理_LinkedList底