【问题标题】:Getting SQLException when debugging调试时出现 SQLException
【发布时间】:2011-11-20 20:27:39
【问题描述】:

我有一个我无法理解的错误。当我调试并尝试运行插入语句时,它会抛出以下异常:

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

【问题讨论】:

  • ID 是自动递增的列吗?
  • 自动增量列也可以手动插入值,所以这可能不是原因。
  • 是的,但前提是在会话中设置了set identity_insert <table> on - 我认为这不是默认设置。

标签: c# .net sql-server ado.net exception-handling


【解决方案1】:

您使用的是丹麦文化设置吗?

在这种情况下,如果 il.Pris 是 double 或 decimal,它将使用逗号打印,这意味着您的 sql 将有一个额外的逗号。

即:

INSERT INTO Indkøbsliste (ListID, ListeNr, Stregkode, Navn, Antal, Pris) Values(33,5566, 'stegkode','somename',4, 99,44)

其中 99,44 是价格。

解决方案是使用参数而不是直接在 sql 中使用值。请参阅已经解释过这一点的其他一些答案。

【讨论】:

    【解决方案2】:

    首先检查连接字符串并确认数据库位置和表的列数。

    建议:不要使用硬编码的 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();
    

    【讨论】:

    • +1 表示 从不 使用连接的 SQL 语句...总是使用参数化查询。
    • @marc_s 谢谢先生。我很高兴收到表扬。
    【解决方案3】:

    请始终使用parametrized queries。这有助于解决您遇到的错误,更重要的是可以防止 SQL 注入(谷歌这个术语,或查看 this 博客条目 - 例如)。

    例如,strege 和/或navn 的实际值是多少。视情况而定,它可能会使您的 SQL 语句在语法上无效或做一些更糟糕的事情。

    一开始它(看起来)需要做更多的工作,但最终会有很大的回报。

    【讨论】:

      猜你喜欢
      • 2015-09-21
      • 1970-01-01
      • 2019-11-19
      • 1970-01-01
      • 1970-01-01
      • 2012-01-06
      • 2020-09-01
      • 1970-01-01
      • 2016-09-10
      相关资源
      最近更新 更多