为啥我得到 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 虽然列号是正确的?的主要内容,如果未能解决你的问题,请参考以下文章