C# 使用 OleDbCommand 向 Access 數據庫插入數據時,拋出異常:「查詢值的數目與目標字段中的數目不同」。本文分析 SQL 語句構造錯誤並給出修正方案。
private void button1_Click(object sender, EventArgs e) {
string a = textBox1.Text;
string b = textBox2.Text;
string c = textBox3.Text;
string d = textBox4.Text;
OleDbCommand cmd = new OleDbCommand(
@"insert into patientvalues(" + a + ",'" + b + "'," + c + ",'" + d + "',con)");
connection.Open();
cmd.Connection = connection;
cmd.ExecuteNonQuery(); // 這裡拋出異常
connection.Close();
this.Hide();
}
insert into patientvalues(...) 中,表名 patientvalues 後缺少空格再接括號,雖然某些數據庫容錯,但規範寫法應為 patientvalues (。VALUES 子句提供了 5 個值(a, b, c, d, con),但表 patientvalues 可能不止 5 列,或者未指定插入的字段名,導致數量不匹配。string sql = "insert into patientvalues (field1, field2, field3, field4, field5) values (?, ?, ?, ?, ?)";
OleDbCommand cmd = new OleDbCommand(sql, connection);
cmd.Parameters.AddWithValue("@p1", a);
cmd.Parameters.AddWithValue("@p2", b);
cmd.Parameters.AddWithValue("@p3", c);
cmd.Parameters.AddWithValue("@p4", d);
cmd.Parameters.AddWithValue("@p5", con); // 假設 con 是變量
cmd.ExecuteNonQuery();
string sql = "insert into patientvalues values (?, ?, ?, ?, ?)";
// 同樣使用參數化
VALUES 值的數量與目標字段數量一致(無論是否寫字段列表)。patientvalues 到底有幾列、每列名稱、類型。總結:異常明確提示「值數目與字段數目不同」,核心是 SQL 語句中列數與值數不匹配。改用參數化、顯式列出字段名,即可徹底解決。