adapter.Fill(table) 拋出「標準運算式中資料類型不匹配」,SQL 為 SELECT * FROM [user] WHERE ID = '...' AND 密碼 = '...'。
ID 欄位在 Access 中為數值型別(Long Integer/Double),SQL 中卻用單引號包裹當作字串,導致型別衝突。
// 錯誤
string sql = "SELECT * FROM [user] WHERE ID = '" + textBox1.Text + "' AND 密碼 = '" + textBox2.Text + "'";
// 正確(數值欄位無引號)
string sql = "SELECT * FROM [user] WHERE ID = " + textBox1.Text + " AND 密碼 = '" + textBox2.Text + "'";
// 最佳:參數化查詢(防注入、自動處理型別)
string sql = "SELECT * FROM [user] WHERE ID = @id AND 密碼 = @pwd";
using (var cmd = new OleDbCommand(sql, conn)) {
cmd.Parameters.Add("@id", OleDbType.Integer).Value = int.Parse(textBox1.Text);
cmd.Parameters.Add("@pwd", OleDbType.VarWChar).Value = textBox2.Text;
adapter.SelectCommand = cmd;
adapter.Fill(table);
}
| Access 型別 | OleDbType | C# 型別 | SQL 寫法 |
|---|---|---|---|
| Long Integer | Integer | int | 無引號 |
| Double | Double | double | 無引號 |
| Text | VarWChar | string | 單引號 |
| Date/Time | Date | DateTime | #yyyy/mm/dd# |
| Yes/No | Boolean | bool | True/False |
原代碼直接拼接用戶輸入構造 SQL,極易遭受 SQL 注入攻擊。務必使用參數化查詢,切勿信任任何外部輸入。