为啥我得到 SQL 错误 110 虽然列号是正确的?

Posted

技术标签:

【中文标题】为啥我得到 SQL 错误 110 虽然列号是正确的?【英文标题】: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 方法的输入,它可能会更清楚出了什么问题。 根据问题指南,请不要发布代码、数据、错误消息等的图像 - 将文本复制或键入问题中。请保留将图像用于图表或演示渲染错误,无法通过文本准确描述的事情。 我希望你明白你应该使用参数而不是字符串连接! 【参考方案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)--(如果你不这样做并尝试了解会发生什么情况会更好)

以上是关于为啥我得到 SQL 错误 110 虽然列号是正确的?的主要内容,如果未能解决你的问题,请参考以下文章

sql聚合函数的使用

为啥我得到 1、10、110、1110 等而不是 1、10、100、1000 等?

TCP 序列号和确认号是如何变化的?

TCP 序列号和确认号是如何变化的?

为啥我在尝试用 110 渲染站点时出现错误?

为啥我不断收到此错误:SQL 命令未正确结束以插入值? [复制]