標籤:sel 資源 常用 mic mysq 資料來源 使用方式 影響 ram
兩種開發方式1.
使用 vs 內建的視覺化檢視,不推薦。
在 vs 的項目中添加 ‘資料集’,然後通過可視化的工具添加資料庫為資料來源,預設可添加 SQL Server 和 Oracle 等,添加 Mysql 前需要額外安裝組件。
優點,內建 sql 語句中特殊字元的轉義,不會出現 sql 注入的問題,配合資料繫結可以在項目前期快速推進項目進度。
缺點:視覺化檢視的使用並不流行,不利於Team Dev的招募和項目後期的修改維護。許多常用的功能很難使用,如:預存程序,事務,串連池控制等。
2.
引用 mysql.data.dll ,在此基礎上進行開發,推薦。
完全由程式碼完成通訊過程。
優點:可以方便的使用各種功能,
缺點:在使用的過程中要注意許多坑,如:異常的捕獲,sql 注入 , 非託管資源的釋放等。
完整的通訊過程1.建立串連,串連分 “長串連” 和 “短串連”
長串連在高頻次的通訊時快速高效,但是佔用資源,在並發訪問下容易耗盡網路資源,對於頻寬較低的區域網路來說,如果大量使用長串連,會佔用網速,影響使用體驗。
短串連在使用時 open, 使用完成後 close,此時串連資源會進入串連池,等待下次串連時使用。雖然資源未被釋放掉,但串連池的開銷不大,是完全可以接受的。短串連一樣需要考慮並發問題。
短串連在使用完成後可以直接 dispose,或者使用 using(){} 來限定串連的範圍,使用完成後自動釋放掉,不進入串連池,這種方式資源佔用最少,但在需要反覆建立串連的情況下串連效率較低。
在實際開發的時候最好使用短串連,並在使用結束後關閉並放入串連池。
string connStr = "server=127.0.0.1; port=3306; user id=user1; Password=pass1; database=data1; pooling = true";MySqlConnection conn = new MySqlConnection(connStr);conn.Open(); conn.Close();
2.使用串連建立 sql 命令並執行1.純 sql 語句,執行後有三種返回方式:
cmd.ExecuteScalar(); // 查詢結果僅一行一列,直接接收
string connStr = "server=127.0.0.1; port=3306; user id=user1; Password=pass1; database=data1; pooling = true";MySqlConnection conn = new MySqlConnection(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(); //可能未null
int count = 0;
if (!obj.Equals(DBNull.Value))
{
count = Convert.ToInt32(obj);
}
conn.Close();
MySqlDataReader reader = cmd.ExecuteReader(); // 通過 reader 獲得大量資料
string connStr = "server=127.0.0.1; port=3306; user id=user1; Password=pass1; database=data1; pooling = true";MySqlConnection conn = new MySqlConnection(connStr);conn.Open();MySqlCommand cmd = conn.CreateCommand();cmd.CommandText = string.Format("select Name from student;");MySqlDataReader reader = cmd.ExecuteReader();List<string> list = new List<string>();while (reader.Read()){ list.Add(reader.GetString("Name"));}reader.Close();conn.Close();
cmd.ExecuteNonQuery(); // 獲得增刪改語句執行後影響的行數
string connStr = "server=127.0.0.1; port=3306; user id=user1; Password=pass1; database=data1; pooling = true";MySqlConnection conn = new MySqlConnection(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 語句的缺點:如果上面例子中的 name 參數中帶有單引號,整個 sql 語句將執行錯誤,因為未對特殊字元進行轉義。主要特殊字元有單引號,反斜線,# 等,而這些特殊字元在不同的使用方式下有時需要轉義,有時不需要轉義。
這就是 sql 注入,sql 注入的概念網上資料較多,在此不再贅述,而常用的解決方案是採用參數化的 sql 語句。
2.sql 語句和 sql 參數
帶有參數的 sql 語句和 sql 參數會分開傳入資料庫伺服器中,伺服器先將 sql 語句進行編譯,然後將 sql 參數匯入編譯後的 sql 語句中(在此過程中自動對特殊字元進行轉義),從而從根源上防止了 sql 注入的發生。
string connStr = "server=127.0.0.1; port=3306; user id=user1; Password=pass1; database=data1; pooling = true";MySqlConnection conn = new MySqlConnection(connStr);conn.Open();MySqlCommand cmd = conn.CreateCommand();cmd.CommandText = "select count(*) from student where Name = @Name;";MySqlParameter[] sps = new MySqlParameter[1];sps[0] = new MySqlParameter("@Name", "Tom");cmd.Parameters.AddRange(sps);object obj = cmd.ExecuteScalar(); //可能未nullint count = 0;if (!obj.Equals(DBNull.Value)){ count = Convert.ToInt32(obj);} conn.Close(); 3.事務4.預存程序
c# 與 Mysql 的通訊方式總結