風險代碼
sql = "insert into table set column='" + comboBox1.Text + "'";
sqlcommand.executescalar(sql, con); -- 拼接 SQL,極易注入
參數化修正
ADO.NET (SqlCommand)
using (var conn = new SqlConnection(connStr))
using (var cmd = new SqlCommand("INSERT INTO RoleUser (RoleName) VALUES (@role)", conn)) {
cmd.Parameters.Add("@role", SqlDbType.NVarChar, 50).Value = comboBox1.Text;
conn.Open();
cmd.ExecuteNonQuery();
}
Entity Framework Core
var entity = new RoleUser { RoleName = comboBox1.Text };
context.RoleUsers.Add(entity);
context.SaveChanges();
Dapper
conn.Execute("INSERT INTO RoleUser (RoleName) VALUES (@role)", new { role = comboBox1.Text });
進階:級聯下拉框綁定
// 綁定數據源
comboBox1.DataSource = GetRoles();
comboBox1.DisplayMember = "RoleName";
comboBox1.ValueMember = "RoleId";
// 取選中值寫入
int roleId = (int)comboBox1.SelectedValue;
cmd.Parameters.Add("@roleId", SqlDbType.Int).Value = roleId;
最佳實踐清單
- ✅ 絕不拼接 SQL,統一使用參數化。
- ✅ 連接/命令對象用
using 確保釋放。
- ✅ 輸入驗證:長度、格式、白名單字符。
- ✅ 事務包裹多表操作。
- ✅ 異常日誌記錄不暴露 SQL 細節給前端。