在 C# 應用程式中操作 MySQL 資料庫時,使用參數化查詢(Parameterized Query)是防止 SQL 注入攻擊、提升程式碼可讀性與維護性的最佳實踐。本文將透過完整範例示範如何使用 MySqlConnection、MySqlCommand 以及 Parameters.AddWithValue 方法安全地執行插入操作。
using MySql.Data.MySqlClient;
MySqlConnection conn = null;
MySqlCommand cmd = null;
try
{
// 連線字串設定(請依實際環境調整)
string connStr = "server=localhost;database=db_name;uid=user;pwd=password;pooling=false;";
conn = new MySqlConnection(connStr);
conn.Open();
// 使用參數化查詢:?ParName 為 MySQL 參數標記
string sql = "INSERT INTO MyTable VALUES (null, ?ParName);";
cmd = new MySqlCommand(sql, conn);
// 參數值處理:將雙引號替換為 ^ 以示範資料清洗
string inputValue = "Sample value passed \"";
string safeValue = inputValue.Replace("\"", "^");
// 加入參數,自動推斷型別
cmd.Parameters.AddWithValue("?ParName", safeValue);
// 執行非查詢命令(INSERT/UPDATE/DELETE)
int rowsAffected = cmd.ExecuteNonQuery();
Console.WriteLine($"成功插入 {rowsAffected} 筆資料。");
}
catch (Exception ex)
{
Console.WriteLine($"資料庫操作發生錯誤:{ex.Message}");
}
finally
{
// 確保資源釋放
if (conn != null && conn.State == System.Data.ConnectionState.Open)
conn.Close();
}
? 作為參數前綴(如 ?ParName),這與 SQL Server 的 @ 或 Oracle 的 : 不同。MySqlDbType 的麻煩。try/finally 或 using 區塊確保連線正確關閉,避免連線洩漏。在實際專案中,建議採用 using 語法簡化資源釋放,並考慮使用 Dapper 或 Entity Framework 等 ORM 框架進一步提升開發效率與安全性。參數化查詢不僅能防禦 SQL 注入,也能讓資料庫引擎重複使用執行計畫,提升效能。