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

INSERT语句列数与VALUES值数不匹配及控件数据库操作问题

问题解决:INSERT列数不匹配+ComboBox/性别单选按钮数据存储与回显

错误提示

INSERT语句中的列数多于VALUES子句中的值数。

问题描述

  • 注册表单向数据库插入数据时,不清楚如何将ComboBox和性别单选按钮的值存入数据库
  • 需要实现:选择ComboBox的值后,在表单上显示对应的数据库数据

原代码问题分析

你的INSERT语句里,列清单包含12个字段(regNo、firstName、lastName、dateOfBirth、gender、address、email、mobilePhone、homePhone、parentName、nic、contactNo),但VALUES里只传了11个值——完全漏掉了gender字段对应的取值,这就是报错的直接原因。

除此之外还有几个严重问题:

  • 直接拼接SQL字符串,存在SQL注入风险,还会因特殊字符(比如单引号)导致语句报错
  • 用ExecuteReader()执行插入操作,插入类操作应该用ExecuteNonQuery()
  • 数据库连接、命令等资源没有正确释放,容易引发资源泄漏

修正后的代码

1. 处理插入逻辑(包含ComboBox和性别单选按钮值)

假设你有两个单选按钮Rbtn_Male和Rbtn_Female,代码如下:

private void Btn_register_Click(object sender, EventArgs e)
{
    // 获取ComboBox的注册编号值
    string regNo = Cbox_regNo.Text;
    // 获取性别单选按钮选中值
    string gender = Rbtn_Male.Checked ? "男" : "女";
    string fName = Tbox_fName.Text;
    string lName = Tbox_lName.Text;
    DateTime dob = dtp_dob.Value;
    string address = Tbox_address.Text;
    string email = Tbox_email.Text;
    string mPhone = Tbox_mPhone.Text;
    string hPhone = Tbox_hPhone.Text;
    string pName = Tbox_parentName.Text;
    string nic = Tbox_nic.Text;
    string cNumber = Tbox_cntctNumber.Text;

    string connString = @"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=""C:\Users\abhin\Desktop\Final Project\Visual Studio\Final Project\Final Project\Student.mdf"";Integrated Security=True";
    // 使用参数化SQL,彻底避免注入问题
    string query = @"INSERT INTO Registrations 
                    (regNo, firstName, lastName, dateOfBirth, gender, address, email, mobilePhone, homePhone, parentName, nic, contactNo)
                    VALUES (@RegNo, @FirstName, @LastName, @DateOfBirth, @Gender, @Address, @Email, @MobilePhone, @HomePhone, @ParentName, @Nic, @ContactNo)";

    // using语句自动释放数据库资源,无需手动关闭
    using (SqlConnection conn = new SqlConnection(connString))
    {
        using (SqlCommand cmdDB = new SqlCommand(query, conn))
        {
            // 添加参数对应字段,类型自动匹配
            cmdDB.Parameters.AddWithValue("@RegNo", regNo);
            cmdDB.Parameters.AddWithValue("@FirstName", fName);
            cmdDB.Parameters.AddWithValue("@LastName", lName);
            cmdDB.Parameters.AddWithValue("@DateOfBirth", dob);
            cmdDB.Parameters.AddWithValue("@Gender", gender);
            cmdDB.Parameters.AddWithValue("@Address", address);
            cmdDB.Parameters.AddWithValue("@Email", email);
            cmdDB.Parameters.AddWithValue("@MobilePhone", mPhone);
            cmdDB.Parameters.AddWithValue("@HomePhone", hPhone);
            cmdDB.Parameters.AddWithValue("@ParentName", pName);
            cmdDB.Parameters.AddWithValue("@Nic", nic);
            cmdDB.Parameters.AddWithValue("@ContactNo", cNumber);

            try
            {
                conn.Open();
                // 插入操作用ExecuteNonQuery,返回受影响行数判断是否成功
                int rowsAffected = cmdDB.ExecuteNonQuery();
                if (rowsAffected > 0)
                {
                    MessageBox.Show("记录添加成功", "注册学生", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    // 清空表单方便下一次注册
                    ClearForm();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show($"错误:{ex.Message}");
            }
        }
    }
}

// 辅助方法:清空表单所有控件内容
private void ClearForm()
{
    Cbox_regNo.SelectedIndex = -1;
    Tbox_fName.Clear();
    Tbox_lName.Clear();
    dtp_dob.Value = DateTime.Now;
    Rbtn_Male.Checked = false;
    Rbtn_Female.Checked = false;
    Tbox_address.Clear();
    Tbox_email.Clear();
    Tbox_mPhone.Clear();
    Tbox_hPhone.Clear();
    Tbox_parentName.Clear();
    Tbox_nic.Clear();
    Tbox_cntctNumber.Clear();
}

2. 实现ComboBox选择后回显数据

给ComboBox添加SelectedIndexChanged事件,选择注册编号后自动填充表单:

private void Cbox_regNo_SelectedIndexChanged(object sender, EventArgs e)
{
    // 空值直接返回,避免无效查询
    if (string.IsNullOrEmpty(Cbox_regNo.Text))
        return;

    string connString = @"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=""C:\Users\abhin\Desktop\Final Project\Visual Studio\Final Project\Final Project\Student.mdf"";Integrated Security=True";
    string query = @"SELECT firstName, lastName, dateOfBirth, gender, address, email, mobilePhone, homePhone, parentName, nic, contactNo
                    FROM Registrations WHERE regNo = @RegNo";

    using (SqlConnection conn = new SqlConnection(connString))
    {
        using (SqlCommand cmd = new SqlCommand(query, conn))
        {
            cmd.Parameters.AddWithValue("@RegNo", Cbox_regNo.Text);
            try
            {
                conn.Open();
                SqlDataReader reader = cmd.ExecuteReader();
                if (reader.Read())
                {
                    // 将查询结果回显到对应控件
                    Tbox_fName.Text = reader["firstName"].ToString();
                    Tbox_lName.Text = reader["lastName"].ToString();
                    dtp_dob.Value = Convert.ToDateTime(reader["dateOfBirth"]);
                    string gender = reader["gender"].ToString();
                    Rbtn_Male.Checked = gender.Equals("男", StringComparison.OrdinalIgnoreCase);
                    Rbtn_Female.Checked = gender.Equals("女", StringComparison.OrdinalIgnoreCase);
                    Tbox_address.Text = reader["address"].ToString();
                    Tbox_email.Text = reader["email"].ToString();
                    Tbox_mPhone.Text = reader["mobilePhone"].ToString();
                    Tbox_hPhone.Text = reader["homePhone"].ToString();
                    Tbox_parentName.Text = reader["parentName"].ToString();
                    Tbox_nic.Text = reader["nic"].ToString();
                    Tbox_cntctNumber.Text = reader["contactNo"].ToString();
                }
                else
                {
                    MessageBox.Show("未找到对应记录");
                    ClearForm();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show($"错误:{ex.Message}");
            }
        }
    }
}

关键说明

  • 解决INSERT报错:补上gender字段的取值,确保列数与VALUES值数完全匹配
  • 参数化SQL:彻底规避SQL注入风险,同时解决特殊字符导致的语句语法错误
  • 资源管理:using语句自动释放数据库连接、命令等资源,避免内存泄漏
  • 单选按钮取值:通过Checked属性判断选中状态,直接获取性别值
  • ComboBox回显:在选择事件中执行查询,将结果逐一填充到表单控件

内容的提问来源于stack exchange,提问作者unagi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 08:35:22