You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 00:32:21