C# 调试时获取SQLException
我犯了一个我不能理解的错误。当我调试并尝试运行insert语句时,它会引发以下异常: “INSERT语句中的列数少于values子句中指定的值。values子句中的值数必须与INSERT语句中指定的列数匹配。” 我已经查遍了我的代码,找不到我犯的错误 这是查询及其周围代码:C# 调试时获取SQLException,c#,.net,sql-server,ado.net,exception-handling,C#,.net,Sql Server,Ado.net,Exception Handling,我犯了一个我不能理解的错误。当我调试并尝试运行insert语句时,它会引发以下异常: “INSERT语句中的列数少于values子句中指定的值。values子句中的值数必须与INSERT语句中指定的列数匹配。” 我已经查遍了我的代码,找不到我犯的错误 这是查询及其周围代码: SqlConnection myCon = DBcon.getInstance().conn(); int id = gm.GetID("SELECT ListID from Indkøbsliste"); id++; C
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();
请经常使用。这有助于处理像您所遇到的错误,更重要的是防止SQL注入(谷歌这个词,或者检查博客条目——作为一个例子)
例如,strege
和/或navn
的实际值是多少。这取决于它可能会使您的SQL语句在语法上无效或执行更糟糕的操作
开始时(看起来)需要做更多的工作,但最终会有很大的收获。首先检查连接字符串,确认数据库位置和表的列数 建议:不要使用硬编码的SQL字符串。使用参数化sql语句或存储过程 尝试参数化方法
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();
您是否使用丹麦文化设置 在这种情况下,如果il.Pris是双精度的或十进制的,它将使用逗号打印,这意味着您的sql将有一个额外的逗号 即: 其中99,44是价格
解决方案是使用参数,而不是直接在sql中使用值。请参阅已经解释了这一点的其他一些答案。是否为
ID
自动递增列?自动递增列也可以手动插入值,因此这可能不是原因。是,但只有在会话中设置了set identity\u insert on
时,我认为这不是默认值。+1表示从不使用连接的SQL语句。。。始终使用参数化查询。@marc_谢谢您,先生。我很高兴收到别人的称赞。
INSERT INTO Indkøbsliste (ListID, ListeNr, Stregkode, Navn, Antal, Pris) Values(33,5566, 'stegkode','somename',4, 99,44)