【问题标题】:Why do I get the SQL error 110 although the Column number is correct?为什么我得到 SQL 错误 110 虽然列号是正确的?
【发布时间】:2021-11-15 07:28:33
【问题描述】:

我正在尝试将一个对象插入到本地 SQL Server 数据库中。我目前面临的问题是这个错误:

System.Data.SqlClient.SqlException:“INSERT 语句中的列数少于 VALUES 子句中指定的值。VALUES 子句中的值数必须与 INSERT 语句中指定的列数匹配。”

错误本身看起来很明显,但在下面的代码中我不再理解了。

知道Kategorie 是表Kategorien 中的外键可能会有所帮助。

我正在调用的方法:

public static void Add(Artikel artikel)
{
    ExecuteSQL($"INSERT INTO [dbo].[Artikel] ([Id], [Name], [Preis], [Kategorie]) VALUES ('{artikel.ID}', '{artikel.Name}',{artikel.Preis}, (SELECT TOP 1 Id FROM Kategorien WHERE Id = '{artikel.Kategorie.ID}'))");
}

ExecuteSQL方法:

private static void ExecuteSQL(string sqlText)
{
    SqlConnection connection = Init();
    SqlCommand sqlCommand = new SqlCommand(sqlText, connection);
    sqlCommand.ExecuteNonQuery();
}

Artikel 表:

enter image description here

希望任何人都可以帮助我。

【问题讨论】:

  • 不确定数据类型是什么,但是,如果 Preis 是非整数并且您使用 , 对于小数位,那么您的 SQL 最终会看起来像“...VALUES (1, ArtikelNaam, 12,00, (SELECT...)" 从 SQL 的角度来看,它看起来像是一个附加条目,而不是一个浮点数。
  • 如果您已经知道类别中的 Id,为什么还要在该点插入查询以检索 Id 值?但是,您真的应该停止以这种方式编写 SQL。使用参数。如果 Name 包含单引号怎么办?
  • 如果您输出 'string sqlText' 作为 ExecuteSQL 方法的输入,它可能会更清楚出了什么问题。
  • 根据问题指南,请不要发布代码、数据、错误消息等的图像 - 将文本复制或键入问题中。请保留将图像用于图表或演示渲染错误,无法通过文本准确描述的事情。
  • 我希望你明白你应该使用参数而不是字符串连接!

标签: c# sql-server database


【解决方案1】:

首先,非常感谢@bschellekens 和@Steve。 解决方案是您的两个 cmets 的混合物。 我现在使用的 SQL 命令是:

INSERT INTO [dbo].[Artikel] ( [Id], [Name], [Preis], [Kategorie] ) VALUES ('{artikel.ID}','{artikel.Name}','{artikel.Preis}', '{artikel.Kategorie.ID}')

问题实际上是小数用逗号分隔,这混淆了 SQL 数据库。

【讨论】:

  • 现在让我们使用包含单引号或更糟的名称尝试此代码,让我们将 artikel.Name 属性设置为 abc,0,0); DROP TABLE Artikel)--(如果你不这样做并尝试了解会发生什么情况会更好)
猜你喜欢
  • 2021-11-08
  • 1970-01-01
  • 1970-01-01
  • 2013-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-18
  • 2015-03-10
相关资源
最近更新 更多