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

C# WinForm项目SQL错误(错误号102)排查求助

问题排查与修复方案

核心错误原因

你遇到的SQL错误(错误号102)是因为在comboBox1_SelectedIndexChanged事件中,创建SqlCommand时错误地传入了学生编号filler作为SQL命令文本,而非之前定义的查询语句query。数据库会把学生编号当作SQL语句执行,自然触发语法错误。

修复步骤及优化代码

1. 修正SqlCommand的命令文本

将SqlCommand cmd = new SqlCommand(filler, con);改为SqlCommand cmd = new SqlCommand(query, con);,确保传入正确的查询语句。

2. 改用参数化查询(必须优化)

原代码直接拼接字符串生成SQL语句,存在SQL注入风险,且如果学生编号包含单引号等特殊字符,会再次触发语法错误。改用参数化查询彻底解决这两个问题。

3. 优化资源管理

使用using语句包裹SqlConnection、SqlCommand、SqlDataReader,确保数据库连接和资源自动释放,避免连接泄漏。

4. 处理边界情况

增加cbRegNo.SelectedItem为空的判断,防止空引用异常。

修复后的完整事件代码:

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    this.ActiveControl = txtFirstName;
    try
    {
        if (cbRegNo.SelectedItem == null) return;
        
        string filler = cbRegNo.SelectedItem.ToString();
        // 使用using自动管理连接资源
        using (SqlConnection con = new SqlConnection(@"Data Source=LALITHA_V\SQLEXPRESS01;Initial Catalog=Skill_International;Integrated Security=True"))
        {
            con.Open();
            // 参数化查询,避免SQL注入和语法错误
            string query = "SELECT * FROM Registration WHERE regNo = @RegNo";
            using (SqlCommand cmd = new SqlCommand(query, con))
            {
                cmd.Parameters.AddWithValue("@RegNo", filler);
                using (SqlDataReader Re = cmd.ExecuteReader())
                {
                    if (Re.Read()) // 因为regNo是唯一标识,用if代替while更合适
                    {
                        txtFirstName.Text = Re.GetValue(1).ToString();
                        txtLastName.Text = Re.GetValue(2).ToString();
                        dobpicker.Text = Re.GetValue(3).ToString();
                        string gender = Re.GetValue(4).ToString();
                        MaleButton.Checked = gender == "Male";
                        FemaleButton.Checked = gender == "Female";
                        txtAddress.Text = Re.GetValue(5).ToString();
                        txtEmail.Text = Re.GetValue(6).ToString();
                        intMobileNo.Text = Re.GetValue(7).ToString();
                        intHomeNo.Text = Re.GetValue(8).ToString();
                        txtParentName.Text = Re.GetValue(9).ToString();
                        txtNIC.Text = Re.GetValue(10).ToString();
                        intContactNo.Text = Re.GetValue(11).ToString();
                    }
                    else
                    {
                        MessageBox.Show("未找到对应记录");
                    }
                }
            }
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show("错误信息:\n" + ex.Message);
    }
}

额外优化建议

你的项目中Insert、Update、Delete操作同样使用了字符串拼接SQL语句,存在相同的SQL注入风险和语法错误隐患,建议统一改为参数化查询。例如新增记录的代码可以优化为:

private void button1_Click(object sender, EventArgs e)
{
    try
    {
        string regNo = cbRegNo.Text;
        string firstName = txtFirstName.Text;
        string lastName = txtLastName.Text;
        string dateOfBirth = dobpicker.Value.ToString("yyyy-MM-dd");
        string gender = MaleButton.Checked ? "Male" : "Female";
        string address = txtAddress.Text;
        string email = txtEmail.Text;
        if (!int.TryParse(intMobileNo.Text, out int mobileNo))
        {
            MessageBox.Show("手机号格式错误");
            return;
        }
        if (!int.TryParse(intHomeNo.Text, out int homeNo))
        {
            MessageBox.Show("家庭电话格式错误");
            return;
        }
        string parentName = txtParentName.Text;
        string nic = txtNIC.Text;
        if (!int.TryParse(intContactNo.Text, out int parentNo))
        {
            MessageBox.Show("家长联系方式格式错误");
            return;
        }

        using (SqlConnection con = new SqlConnection(@"Data Source=LALITHA_V\SQLEXPRESS01;Initial Catalog=Skill_International;Integrated Security=True"))
        {
            con.Open();
            string query = @"INSERT INTO Registration(regNo,firstName,lastName,dateOfBirth,gender,addresses,email,mobilePhone,homePhone,parentName,nic,contactNo) 
                            VALUES(@RegNo,@FirstName,@LastName,@DateOfBirth,@Gender,@Addresses,@Email,@MobilePhone,@HomePhone,@ParentName,@Nic,@ContactNo)";
            using (SqlCommand cmd = new SqlCommand(query, con))
            {
                cmd.Parameters.AddWithValue("@RegNo", regNo);
                cmd.Parameters.AddWithValue("@FirstName", firstName);
                cmd.Parameters.AddWithValue("@LastName", lastName);
                cmd.Parameters.AddWithValue("@DateOfBirth", dateOfBirth);
                cmd.Parameters.AddWithValue("@Gender", gender);
                cmd.Parameters.AddWithValue("@Addresses", address);
                cmd.Parameters.AddWithValue("@Email", email);
                cmd.Parameters.AddWithValue("@MobilePhone", mobileNo);
                cmd.Parameters.AddWithValue("@HomePhone", homeNo);
                cmd.Parameters.AddWithValue("@ParentName", parentName);
                cmd.Parameters.AddWithValue("@Nic", nic);
                cmd.Parameters.AddWithValue("@ContactNo", parentNo);

                cmd.ExecuteNonQuery();
                MessageBox.Show("Record Added", "Register");
                cbRegNo.Items.Add(regNo);
            }
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show("Error\n" + ex.Message);
    }
}

内容的提问来源于stack exchange,提问作者Lalitha Sri Vidhara

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 03:29:54