C# 调试时获取SQLException

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

我犯了一个我不能理解的错误。当我调试并尝试运行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();
请经常使用。这有助于处理像您所遇到的错误,更重要的是防止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)