调试时获取SQLException

时间:2011-09-20 07:39:06

标签: 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++;

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

3 个答案:

答案 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中使用这些值。看看已经解释过的其他一些答案。