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

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
    }
}

优化说明

  1. 前端校验:提前拦截空值、数据类型错误,减少无效数据库请求,提升用户体验
  2. 参数化查询:彻底避免SQL注入风险,同时自动匹配数据库数据类型,降低类型转换错误概率
  3. using语句:自动管理数据库连接和命令对象,避免资源泄漏
  4. 异常捕获:捕获SQL Server抛出的约束违反、类型不匹配等错误,给用户友好提示

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 19:20:52