【问题标题】:Number of query values and destination fields are not the same error查询值和目标字段数不一样的错误
【发布时间】:2011-12-24 04:17:02
【问题描述】:

将数据插入数据库时​​出现错误。

错误是:

“查询值和目标字段的数量不一样”。

插入代码:

OleDbConnection vconn = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Users\\Mutyyba\\Documents\\Database1.accdb");
vconn.Open();

string name = textBox1.Text;
string address = textBox3.Text;
int rollno = Convert.ToInt32(textBox2.Text);

string vquery = "insert into Table1 values(@vname,@vrollno,@vaddress)";

OleDbCommand vcomm = new OleDbCommand(vquery, vconn);
vcomm.Parameters.AddWithValue("@vname", name);
vcomm.Parameters.AddWithValue("@vrollno", rollno);
vcomm.Parameters.AddWithValue("@vaddress", address);

vcomm.ExecuteNonQuery();

MessageBox.Show("your record has been recorded sucessfully!");

vconn.Close();

我做错了什么?

【问题讨论】:

  • 查询中有大约16个字段,数据库表中的列数是多少?
  • 我的数据库表中有 16 列
  • 请在有人咬你之前开始使用SqlParameter
  • 实际上,您在查询中拥有所有一个预期字段。开头有一个单引号,结尾有一个单引号,因此除非这些字符串中有任何未转义的引号,否则您将尝试插入一个字段。因此,你的错误。但不要停止修复它,查看参数化查询,以免遇到那些讨厌的 SQL 注入问题。
  • 那么缺少一些单引号,检查关联的数据类型,就像它应该是单引号中的名称values('" + Name + "',

标签: c# winforms ms-access oledbconnection


【解决方案1】:

我想你只是错过了一些单引号。我看到您已用起始和结束单引号括起所有参数。见this

还有一件事,当您传递大量参数时,请为参数准备一个 SqlCommand 对象。 详情请见msdn

做这样的事情:

  SqlCommand comm = new SqlCommand("INSERT INTO table VALUES (@txtsno, @txtdesg, @txtbasic)", connection);

  comm.Parameters.AddWithValue("@txtsno", txtsno.Text.Trim());

  comm.Parameters.AddWithValue("@txtsno", txtdesg.Text.Trim());

  comm.Parameters.AddWithValue("@txtsno", txtbasic.Text.Trim());

这样会更清晰,不会出现SQL Injection.

【讨论】:

  • 请使用参数。不要使用 .AddWithValue(),因为它会让 .Net 运行时猜测您的 sql 数据类型。有时运行时会猜错,出现难以调试的结果或奇怪的性能问题。
  • 感谢您的所有帮助,谢谢
  • @Joel:是的,谢谢。我在同一行中发现了这一点forums.asp.net/t/1200255.aspx/…
【解决方案2】:

尝试使用参数构建命令

   // Create the InsertCommand.
    command = new OleDbCommand(
        "INSERT INTO Customers (CustomerID, CompanyName) " +
        "VALUES (?, ?)", connection);
   // add parameters like below 
    command.Parameters.Add(
        "CustomerID", OleDbType.Char, 5, "CustomerID");
    command.Parameters.Add(
        "CompanyName", OleDbType.VarChar, 40, "CompanyName");

【讨论】:

    【解决方案3】:

    您需要在 SQL 中指定列名,或者值序列应该与表的默认架构完全相同(数字和顺序)

    OleDbCommand cmd = new OleDbCommand("insert into real (name, symbol, date, red, redby, redsell, sbintrabuy, sbtr1, sbtr2, sbtr3, sbintersell, sbtr1, sbtr2, sbtr3, rstl, green) values('" + Name + "','" + Symbol + "','" + Date + "','" + Red + "','" + RedBuy + "','" + RedSell + "','" + SBIntraBuy + "','" + SBTR1 + "','" + SBTR2 + "','" + SBTR3 + "','" + SBIntraSell + "','" + SBTR1 + "','" + SBTR2 + "','" + SBTR3 + "','" + RSTL + "','" + Green + "');", con);
    

    粗体列替换为正确的名称,建议明确指定列名。

    字符串值应围绕单个配额

    一般情况下,你应该这样写sql:

    cmd.Parameters.Add("var", System.Data.OleDb.OleDbType.VarChar); cmd.Parameters["var"].Value = 'somevalue';

    在你的 sql 中应该是这样的:“insert into real(column1) values(@var)”。

    ====

    我更新了上面的答案,希望能解决你的问题。

    【讨论】:

    • 所有这些值都用单引号括起来,这没有意义
    【解决方案4】:
    insert into Main values (28494,1,False,'Buto-asma  Sirop' , 'Buto-asma  Sirop', 3.99 , 'Syrup', 'ispani', ' ', ' ',0, '1',4988 )
    

    解决了这个问题

    【讨论】:

    • 两个表连接但是这个问题是怎么发生的
    • 请考虑在您的答案周围实际添加格式和一些上下文。
    • 请不要在答案部分添加问题。也在这里:stackoverflow.com/a/28897538/1699210
    • @bummi 这不是问题,目的很明确。
    • 此声明与问题没有任何关系。它似乎与您现在已删除的答案有关,您在其他地方发布并提出了一个您不应该在答案框中提出的新问题。请记住,我们不是论坛。我建议您使用tour 并重新访问How to Ask,也许花一些时间阅读help center 中的其他材料。祝你好运!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多