首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C# OleDb 插入數據報錯「查詢值的數目與目標字段數目不同」解決方案

     編輯:程式設計綜合問答

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();
}

錯誤原因分析

  1. SQL 語法錯誤:insert into patientvalues(...) 中,表名 patientvalues 後缺少空格再接括號,雖然某些數據庫容錯,但規範寫法應為 patientvalues (。
  2. 字段列表缺失或不匹配:VALUES 子句提供了 5 個值(a, b, c, d, con),但表 patientvalues 可能不止 5 列,或者未指定插入的字段名,導致數量不匹配。
  3. 參數拼接風險:直接拼接字符串易導致 SQL 注入、格式錯誤(如字符串未轉義單引號)。

正確寫法

方案一:顯式指定字段名(推薦)

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();

方案二:若表確只有 5 列,可省略字段名但需保證順序

string sql = "insert into patientvalues values (?, ?, ?, ?, ?)";
// 同樣使用參數化

關鍵修正點

  • 使用參數化查詢,防止注入、自動處理類型轉換與特殊字符。
  • 確保 VALUES 值的數量與目標字段數量一致(無論是否寫字段列表)。
  • 檢查表結構:打開 Access 確認 patientvalues 到底有幾列、每列名稱、類型。

總結:異常明確提示「值數目與字段數目不同」,核心是 SQL 語句中列數與值數不匹配。改用參數化、顯式列出字段名,即可徹底解決。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved