2012年2月8日 星期三

C# : 使用 Parameters 處理 MySQL 語句

通常在程式中的 MySQL 語句,我們都是使用一般字串與變數直接組合而成,而這個變數值有時候是使用者從 client 端的表單傳送過來的,此時,如果某些防護未顧慮到,使用者輸入錯誤字元或是利用單引號、分號等特殊字元,將可輕易的中斷原本的 MySQL 語句,進而自行輸入其它語句來對資料庫做其它操作,這將可能發生執行期錯誤,甚至危害到系統。
使用 Parameters 可有效避免以上的問題,因為它將只針對語句中的欄位值做處理,所以在語句中欄位值的位置也不用特別使用單引號代表欄位值,如此不但使程式變得更為安全,也提高了程式可讀性,方便管理與維護。

通常我們會使用一個特殊符號為開頭的字串來代表 Parameters 要將欄位值放入的位置,例如:

string sql = "SELECT name FROM test_table WHERE id=@id";

此處的 @id 就是要讓 Parameters 替換掉的部份。



EX:
//開啟連線
MySqlConnection conn = new MySqlConnection("server=127.0.0.1;user=root;database=test;port=3306;password=1111;");
conn.Open();

//建立 MySQL 命令,並設置 parameter 替換欄位值的字串
string sql = "SELECT name FROM test_table WHERE id=@id";
MySqlCommand cmd = new MySqlCommand(sql, conn);

// userInput 為使用者傳入的欄位值;利用 Paramerters 放入對應的位置
cmd.Parameters.AddWithValue("@id", userInput);

//讀取資料並列出
MySqlDataReader data = cmd.ExecuteReader();
while (data.Read()){
    Console.WriteLine("id={0} , name={1}", data["id"], data["name"]);
}
data.Close();

以上只是簡單的查詢資料範例,新增、修改、刪除資料也都可使用這個方式變更原本的 MySQL 語句並緊接著使用 Paramerters.AddWithValue() 為指定位置放入欄位值即可。