我有一个我无法理解的错误。当我正在调试并尝试运行insert语句时,它抛出以下异常:
“INSERT语句中的列少于VALUES子句中指定的值.VALUES子句中的值数必须与INSERT语句中指定的列数相匹配。”
我查看了我的所有代码,但我找不到我犯的错误。
这是查询和周围的代码:
SqlConnection myCon = DBcon.getInstance().conn();
int id = gm.GetID("SELECT ListID from Indkøbsliste");
id++;
Console.WriteLine("LNr: " + listnr);
string streg = GetStregkode(navne);
Console.WriteLine("stregk :" + strege);
string navn = GetVareNavn(strege);
Console.WriteLine("navn :" + navne);
myCon.Open();
string query = "INSERT INTO Indkøbsliste (ListID, ListeNr, Stregkode, Navn, Antal, Pris) Values(" + id + "," + listnr + ", '" + strege + "','" + navn + "'," + il.Antal + ", "+il.Pris+")";
Console.WriteLine(il.Antal+" Antal");
Console.WriteLine(il.Pris+" Pris");
Console.WriteLine(id + " ID");
SqlCommand com = new SqlCommand(query, myCon);
com.ExecuteNonQuery();
com.Dispose();
myCon.Close();
答案 0 :(得分:1)
请始终使用parametrized queries。这有助于解决您所拥有的错误,更重要的是防止SQL注入(谷歌术语,或检查this博客条目 - 作为示例)。
例如,strege
和/或navn
的实际值是多少。根据它可能会使您的SQL语句在语法上无效或做更糟糕的事情。
它(看起来)在开始时会多做一些工作,但最终会付出很大的代价。
答案 1 :(得分:1)
首先检查连接字符串并确认数据库的位置和表的列数。
建议:不要使用硬编码的SQL字符串。使用参数化的sql语句或stored-proc。
尝试参数化方式,
string query = "INSERT INTO Indkøbsliste (ListID, ListeNr, Stregkode, Navn, Antal, Pris)
Values (@ListID, @ListeNr, @Stregkode, @Navn, @Antal, @Pris)"
SqlCommand com = new SqlCommand(query, myCon);
com.Parameters.Add("@ListID",System.Data.SqlDbType.Int).Value=id;
com.Parameters.Add("@ListeNr",System.Data.SqlDbType.Int).Value=listnr;
com.Parameters.Add("@Stregkode",System.Data.SqlDbType.VarChar).Value=strege ;
com.Parameters.Add("@Navn",System.Data.SqlDbType.VarChar).Value=navn ;
com.Parameters.Add("@Antal",System.Data.SqlDbType.Int).Value=il.Antal;
com.Parameters.Add("@Pris",System.Data.SqlDbType.Int).Value=il.Pris;
com.ExecuteNonQuery();
答案 2 :(得分:0)
您使用的是丹麦文化设置吗?
在这种情况下,如果il.Pris是一个双精度或小数,它将使用逗号打印,这意味着你的sql将有一个额外的逗号。
即:
INSERT INTO Indkøbsliste (ListID, ListeNr, Stregkode, Navn, Antal, Pris) Values(33,5566, 'stegkode','somename',4, 99,44)
其中99,44是价格。
解决方案是使用参数而不是直接在您的sql中使用这些值。看看已经解释过的其他一些答案。