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
相关产品推荐
相关产品推荐

