C# 向Card_tbl表插入含字母的CardID时报INVALID COLUMN NAME错误
问题根源
你当前的代码直接将用户输入的卡号拼接进SQL语句,对于VARCHAR类型的字段,插入的字符串值需要用单引号包裹:
- 当输入纯数字
12345时,生成的SQL是insert into Card_tbl values(12345),SQL Server支持数字隐式转换为VARCHAR类型,所以可以执行成功 - 当输入混合字符
Q1234R时,生成的SQL是insert into Card_tbl values(Q1234R),SQL Server会把没有被单引号包裹的Q1234R识别为列名,自然就抛出列名不存在的错误
正确解决方法
绝对不要使用字符串拼接SQL的写法,这种写法存在严重的SQL注入安全风险,攻击者可以构造特殊输入删库、窃取数据。推荐使用参数化查询解决问题,既能避免SQL注入,也不用手动处理单引号、数据类型适配的问题。
修正后的代码如下:
Con.Open(); // 编写带参数占位符的SQL语句,推荐显式指定插入的字段名,避免表结构变更后语句失效 SqlCommand cmd = new SqlCommand("insert into Card_tbl (CardID) values(@CardID)", Con); // 添加参数,自动处理数据类型适配 cmd.Parameters.AddWithValue("@CardID", txtCardNumber.Text); cmd.ExecuteNonQuery(); MessageBox.Show("Admin Successfully Added!"); Con.Close(); populate(); //updateroomstate(); Clean();
临时应急方案(仅用于测试,绝对不要在生产环境使用)
如果只是临时测试验证,也可以手动给输入内容加单引号,但这种方式依然存在SQL注入风险,非常不推荐:
// 错误写法,仅作原理演示,不要使用 SqlCommand cmd = new SqlCommand("insert into Card_tbl values('" + txtCardNumber.Text.Replace("'", "''") + "')", Con);
内容的提问来源于stack exchange,提问作者user16052862
相关产品推荐
相关产品推荐

