C# WinForms注册功能:非法输入时弹出MessageBox提示需求
C# WinForms注册功能优化:数据校验与异常提示
我用C# WinForms开发注册功能,连接SQL Server数据库,目前已经实现RegNo重复校验的注册按钮功能,现在需要优化以下需求:
- 当文本框输入不匹配数据类型的值(比如名字输入纯数字、电话输入非数字字符串)时,弹出提示框
- 当输入违反数据库NOT NULL约束时,弹出提示框
我的SQL Server数据库表说明
Register表包含以下核心字段及约束:
- 必填字段(NOT NULL):Firstname、Lastname、DOB、GENDER、ADDRESS、EMAIL、MOBILE、NIC
- 数据类型:MOBILE、CONTACT为数值类型,DOB为日期类型,其余字段为字符串类型
原注册按钮代码
private void button1_Click(object sender, EventArgs e) { string gender = "Male"; if (radioButton1.Checked) { gender = "Male"; } else if (radioButton2.Checked) { gender = "female"; } SqlConnection con = new SqlConnection("Data Source=LAPTOP-78IBEHAB;Initial Catalog=student;Integrated Security=True"); con.Open(); SqlCommand cmd2 = new SqlCommand("select Regno from Register where Regno = @Regno",con); cmd2.Parameters.AddWithValue("Regno",comboBox1.Text); SqlDataReader sdr = cmd2.ExecuteReader(); if (sdr.Read()) { con.Close(); MessageBox.Show("Duplicate Reg No"); } else { con.Close(); SqlCommand cmd = new SqlCommand(); cmd.Connection = con; cmd.CommandType = CommandType.Text; cmd.CommandText = "insert into Register(Firstname, Lastname, DOB, GENDER, ADDRESS, EMAIL, MOBILE, HOME, PARENT, NIC, CONTACT,COURSE)\r\nvalues\r\n('" + textBox1.Text + "', '" + textBox2.Text + "', '" + dateTimePicker1.Text + "', '" + gender + "', '" + textBox3.Text + "', '" + textBox4.Text + "', '" + textBox5.Text + "', '" + textBox6.Text + "', '" + textBox7.Text + "', '" + textBox8.Text + "', '" + textBox9.Text + "','"+comboBox2.Text+"')"; con.Open(); cmd.ExecuteNonQuery(); con.Close(); MessageBox.Show("Registration successfull"); textclear(); comboBox1.Items.Clear(); comdata(); } }
优化方案及代码
优化分为前端提前校验和数据库异常捕获两部分,同时修复原代码的SQL注入风险:
private void button1_Click(object sender, EventArgs e) { // 1. 前端输入校验 // 非空校验:检查必填字段 if (string.IsNullOrWhiteSpace(textBox1.Text) || string.IsNullOrWhiteSpace(textBox2.Text) || string.IsNullOrWhiteSpace(textBox3.Text) || string.IsNullOrWhiteSpace(textBox4.Text) || string.IsNullOrWhiteSpace(textBox5.Text) || string.IsNullOrWhiteSpace(textBox8.Text) || (!radioButton1.Checked && !radioButton2.Checked)) { MessageBox.Show("请填写所有必填字段"); return; } // 数据类型校验:手机号、联系电话必须是数字 if (!long.TryParse(textBox5.Text, out _)) { MessageBox.Show("手机号必须是数字"); textBox5.Focus(); return; } if (!string.IsNullOrWhiteSpace(textBox9.Text) && !long.TryParse(textBox9.Text, out _)) { MessageBox.Show("联系电话必须是数字"); textBox9.Focus(); return; } // 名字校验:不允许纯数字(可根据需求调整规则) if (textBox1.Text.All(char.IsDigit)) { MessageBox.Show("名字不能是纯数字"); textBox1.Focus(); return; } if (textBox2.Text.All(char.IsDigit)) { MessageBox.Show("姓氏不能是纯数字"); textBox2.Focus(); return; } string gender = radioButton1.Checked ? "Male" : "female"; string regNo = comboBox1.Text; // 2. 数据库操作:使用参数化查询+异常捕获 string connectionString = "Data Source=LAPTOP-78IBEHAB;Initial Catalog=student;Integrated Security=True"; using (SqlConnection con = new SqlConnection(connectionString)) { try { con.Open(); // 重复RegNo校验 using (SqlCommand checkCmd = new SqlCommand("SELECT COUNT(*) FROM Register WHERE Regno = @Regno", con)) { checkCmd.Parameters.AddWithValue("@Regno", regNo); int count = (int)checkCmd.ExecuteScalar(); if (count > 0) { MessageBox.Show("RegNo已重复"); return; } } // 插入数据:参数化查询避免SQL注入,同时匹配数据类型 using (SqlCommand insertCmd = new SqlCommand(@"INSERT INTO Register (Firstname, Lastname, DOB, GENDER, ADDRESS, EMAIL, MOBILE, HOME, PARENT, NIC, CONTACT, COURSE) VALUES (@Firstname, @Lastname, @DOB, @GENDER, @ADDRESS, @EMAIL, @MOBILE, @HOME, @PARENT, @NIC, @CONTACT, @COURSE)", con)) { // 绑定参数,自动匹配数据库类型 insertCmd.Parameters.AddWithValue("@Firstname", textBox1.Text); insertCmd.Parameters.AddWithValue("@Lastname", textBox2.Text); insertCmd.Parameters.AddWithValue("@DOB", dateTimePicker1.Value); // 用Value而非Text,确保日期格式正确 insertCmd.Parameters.AddWithValue("@GENDER", gender); insertCmd.Parameters.AddWithValue("@ADDRESS", textBox3.Text); insertCmd.Parameters.AddWithValue("@EMAIL", textBox4.Text); insertCmd.Parameters.AddWithValue("@MOBILE", long.Parse(textBox5.Text)); // 已提前校验,直接转换 insertCmd.Parameters.AddWithValue("@HOME", textBox6.Text); insertCmd.Parameters.AddWithValue("@PARENT", textBox7.Text); insertCmd.Parameters.AddWithValue("@NIC", textBox8.Text); insertCmd.Parameters.AddWithValue("@CONTACT", string.IsNullOrWhiteSpace(textBox9.Text) ? DBNull.Value : (object)long.Parse(textBox9.Text)); insertCmd.Parameters.AddWithValue("@COURSE", comboBox2.Text); insertCmd.ExecuteNonQuery(); MessageBox.Show("注册成功"); // 清空表单 textclear(); comboBox1.Items.Clear(); comdata(); } } catch (SqlException ex) { // 捕获数据库异常,比如违反NOT NULL、数据类型不匹配等 MessageBox.Show($"注册失败:{ex.Message}"); } catch (Exception ex) { MessageBox.Show($"系统错误:{ex.Message}"); } // using块会自动关闭连接,无需手动Close } }
优化说明
- 前端校验:提前拦截空值、数据类型错误,减少无效数据库请求,提升用户体验
- 参数化查询:彻底避免SQL注入风险,同时自动匹配数据库数据类型,降低类型转换错误概率
- using语句:自动管理数据库连接和命令对象,避免资源泄漏
- 异常捕获:捕获SQL Server抛出的约束违反、类型不匹配等错误,给用户友好提示
内容的提问来源于stack exchange,提问作者Bakeer
相关产品推荐
相关产品推荐

