SQL插入数据提示值与列数不匹配但参数无误,如何排查解决?
问题排查及解决方案
- 报错的核心原因是手动拼接SQL语句时语法错误,同时存在SQL注入高危风险:
- 你的INSERT语句中漏写了各个插入值之间的逗号、以及字符串类型值需要包裹的单引号,导致
test2(用户名)、Test2(邮箱)、testPassword(密码)三个值被拼接成了完整字符串test2test2testPassword,数据库误将该字符串识别为列名进行检索,触发无效列名报错。 - 拼接错误导致原本需要传入的3个值被合并为1个,和你INSERT语句前半部分声明的要插入的列数量不匹配,触发第二个报错。
- 你的INSERT语句中漏写了各个插入值之间的逗号、以及字符串类型值需要包裹的单引号,导致
- 修复步骤:
- 优先使用参数化查询代替手动拼接SQL,既可以避免语法错误,还能彻底杜绝SQL注入风险,以C#代码为例参考写法:
// 替换为实际的数据库连接字符串 string connStr = "你的数据库连接配置"; // 列名替换为你实际用户表的字段名,用占位符代替直接拼接值 string insertSql = "INSERT INTO 你的用户表名 (Username,Email,Password) VALUES (@Username,@Email,@Password)"; using (SqlConnection connection = new SqlConnection(connStr)) { connection.Open(); using (SqlCommand command = new SqlCommand(insertSql, connection)) { // 给参数赋值,框架自动处理引号、转义等问题 command.Parameters.AddWithValue("@Username", 你的用户名字段值); command.Parameters.AddWithValue("@Email", 你的邮箱字段值); command.Parameters.AddWithValue("@Password", 你的密码字段值); command.ExecuteNonQuery(); } }- 额外检查INSERT语句中声明的插入列数量,确认没有把仅做前端校验的
Confirm Password对应的字段也写入INSERT的列列表中,保证列数量和传入的参数数量完全一致。
内容的提问来源于stack exchange,提问作者ThatDude
相关产品推荐
相关产品推荐

