C#执行INSERT插入Orders表报值列数与表定义不匹配错误
报错直接原因
触发Column name or number of supplied values does not match table definition错误的核心原因是插入语句传入的值数量和表要求的字段数不匹配:
- 查看
Orders表结构,除自增主键Id外,共有7个业务字段需要赋值:Username、Email、Address、City、State、pincode、PhoneNumber - 你拼接的INSERT语句VALUES块实际只传入了6个值:代码里把
dr["City"]和dr["State"]的内容拼接后放在了同一对单引号中,SQL会将这部分内容解析为单个字段值,直接少了State字段对应的独立传值位,和表定义无法匹配。你自己核对时大概率是把代码里拼接的City、State误判成了两个独立传值项,才会误以为数量对应。
即时修复方案
首先修正INSERT语句的拼接逻辑,把City和State拆成两个独立的值传入,同时必须显式指定插入的字段列表,避免后续表结构调整、字段顺序变动时再次出现同类匹配错误,修正后的SQL拼接片段如下:
cmd1.CommandText = "insert into Orders (Username,Email,Address,City,State,pincode,PhoneNumber) values ('" + dr["Username"].ToString() + "','" + dr["Email"].ToString() + "','" + dr["Address"].ToString() + "','" + dr["City"].ToString() + "','" + dr["State"].ToString() + "','" + dr["pincode"].ToString() + "','" + dr["PhoneNumber"].ToString() + "')";
写INSERT语句时哪怕表有自增主键,也不要省略字段列表,这是规避字段数量、顺序匹配错误的最有效手段。
其他代码隐患修复建议
现有代码还存在几个会触发异常、导致性能问题或带来安全风险的问题,建议一并修复:
- 删除SELECT查询后多余的
cmd.ExecuteNonQuery();语句:ExecuteNonQuery仅用于执行增、删、改类操作,查询场景下调用属于无效代码,不会返回查询结果还会额外占用数据库资源 - 不要用字符串拼接的方式生成SQL:现有写法存在严重SQL注入风险,同时如果字段内容包含单引号(比如地址内容为
No.1, Yanta West Rd, Xi'an)会直接触发SQL语法错误,必须改用参数化查询 - 数据库连接、SqlCommand、SqlDataAdapter等对象都应该用
using块包裹,确保资源自动释放,避免数据库连接泄漏 - 直接对
Request.QueryString、Session取到的对象调用ToString()会在值为null时抛出空引用异常,取值前需要先做非空判断
参数化改写后的参考代码如下:
protected void Page_Load(object sender, EventArgs e) { // 先做非空校验 string order = Request.QueryString["order"]?.ToString(); string currentOrderNo = Session["order_no"]?.ToString(); string currentUserName = Session["user_name"]?.ToString(); if (string.IsNullOrEmpty(order) || string.IsNullOrEmpty(currentOrderNo) || string.IsNullOrEmpty(currentUserName) || order != currentOrderNo) { // 校验不通过的跳转或返回逻辑 return; } // using块自动释放连接资源 using (SqlConnection con = new SqlConnection("你的数据库连接字符串")) { con.Open(); // 查询用户信息用参数化 string getUserSql = "select Username,Email,Address,City,State,pincode,PhoneNumber from UserTable where Username = @UserName"; using (SqlCommand cmd = new SqlCommand(getUserSql, con)) { cmd.Parameters.AddWithValue("@UserName", currentUserName); DataTable dt = new DataTable(); using (SqlDataAdapter da = new SqlDataAdapter(cmd)) { da.Fill(dt); } // 插入订单用参数化 string insertOrderSql = @"insert into Orders (Username,Email,Address,City,State,pincode,PhoneNumber) values (@Username,@Email,@Address,@City,@State,@Pincode,@PhoneNumber)"; foreach (DataRow dr in dt.Rows) { using (SqlCommand cmd1 = new SqlCommand(insertOrderSql, con)) { cmd1.Parameters.AddWithValue("@Username", dr["Username"].ToString()); cmd1.Parameters.AddWithValue("@Email", dr["Email"].ToString()); cmd1.Parameters.AddWithValue("@Address", dr["Address"].ToString()); cmd1.Parameters.AddWithValue("@City", dr["City"].ToString()); cmd1.Parameters.AddWithValue("@State", dr["State"].ToString()); cmd1.Parameters.AddWithValue("@Pincode", dr["pincode"].ToString()); cmd1.Parameters.AddWithValue("@PhoneNumber", dr["PhoneNumber"].ToString()); cmd1.ExecuteNonQuery(); } } } } }
内容的提问来源于stack exchange,提问作者CloudyBlue
相关产品推荐
相关产品推荐

