列数正确却报SQL错误110?插入SQL Server数据时列值不匹配如何解决
问题原因
- 核心触发点是数值格式的区域适配问题:
Preis为数值类型,当程序运行环境的区域设置使用逗号作为小数分隔符时,{artikel.Preis}字符串拼接后会生成类似9,99的格式,SQL会将其识别为两个独立的值,导致VALUES子句的值总数从4个变为5个,和INSERT语句指定的4个列不匹配,触发报错。 - 额外存在的其他隐患:字符串拼接SQL存在SQL注入风险,若
Name字段内容包含单引号时也会触发SQL语法错误。
修复方案
改用参数化查询,完全规避字符串拼接带来的各类问题:
第一步:修改ExecuteSQL方法支持传入参数
private static void ExecuteSQL(string sqlText, params SqlParameter[] parameters) { using (SqlConnection connection = Init()) { SqlCommand sqlCommand = new SqlCommand(sqlText, connection); if (parameters != null) { sqlCommand.Parameters.AddRange(parameters); } sqlCommand.ExecuteNonQuery(); } }
注:增加using块保证数据库连接正常释放,避免连接泄漏。
第二步:修改Add方法使用参数化查询
public static void Add(Artikel artikel) { string sql = @"INSERT INTO [dbo].[Artikel] ([Id], [Name], [Preis], [Kategorie]) VALUES (@Id, @Name, @Preis, @KategorieId)"; ExecuteSQL(sql, new SqlParameter("@Id", artikel.ID), new SqlParameter("@Name", artikel.Name), new SqlParameter("@Preis", artikel.Preis), new SqlParameter("@KategorieId", artikel.Kategorie.ID) ); }
说明:如果Artikel表的Id字段是自增主键(IDENTITY),可直接移除INSERT语句中的Id列和对应参数,不需要手动插入。
内容的提问来源于stack exchange,提问作者C3wyn
相关产品推荐
相关产品推荐

