Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 查询值和目标字段的数目不相同错误_C#_Winforms_Ms Access_Oledbconnection - Fatal编程技术网

C# 查询值和目标字段的数目不相同错误

C# 查询值和目标字段的数目不相同错误,c#,winforms,ms-access,oledbconnection,C#,Winforms,Ms Access,Oledbconnection,将数据插入数据库时出错 错误是: “查询值和目标字段的数量不相同” 插入代码: 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

将数据插入数据库时出错

错误是:

“查询值和目标字段的数量不相同”

插入代码:

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

我做错了什么?

我想你只是漏掉了几句话。我看到您已经用一个开始和结束单引号括起了所有参数。看

还有一件事,在传递大量参数时,为参数准备一个SqlCommand对象。 有关更多详细信息,请参阅

这样做:

  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中指定列名的情况,或者值序列应该与表的默认模式完全相同(数字和顺序)

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中,应该是这样的:“插入到实(column1)值(@var)”中

====


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

尝试使用参数来构建命令

   // 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");

解决此问题

查询中大约有16个字段,数据库表中的列数是多少?我的数据库表中有16列,请在有人咬你之前开始使用。实际上,查询中有所有预期字段。您在开头有一个单引号,在结尾有一个单引号,因此除非这些字符串中有任何未转换的引号,否则您将尝试只插入一个字段。因此,你的错误。但是,不要停止修复该问题,请查看参数化查询,以免遇到令人讨厌的SQL注入问题。如果缺少一些单引号,请检查关联的数据类型,就像单引号中的名称
值(“+Name+”,
使用参数。不要使用.AddWithValue(),因为它会让.Net运行时猜测您的sql数据类型。有时运行时会猜错,导致难以调试的结果或奇怪的性能问题。感谢您的帮助Thanks@Joel:是的,有效点谢谢。我在同一行中发现了这一点,所有这些值都包含在一个引号中,这对表连接没有意义这个问题解决了如何考虑在你的答案中加上格式化和一些上下文。请不要把问题添加到答案部分。这里:@ BuMMI这不是一个问题,意图显然是要回答的。这个声明并没有单单涉及这个问题。它似乎与你现在删除的答案有关。你在其他地方发帖,问了一个新问题,你不应该在回答框里问。记住我们不是一个论坛。我建议你花点时间重新访问,或者花点时间阅读论坛上的其他材料。祝你好运!
insert into Main values (28494,1,False,'Buto-asma  Sirop' , 'Buto-asma  Sirop', 3.99 , 'Syrup', 'ispani', ' ', ' ',0, '1',4988 )