如何避免通过 winform 在表中输入重复值

本文关键字:输入 何避免 winform | 更新日期: 2023-09-27 18:31:51

在我的项目中,我将客户端名称设置为主键,如果我输入相同的值,我将得到异常,现在我想编写验证,即如果我重新输入主键值,那么我应该收到一条消息,例如"数据已存在",请帮助我这样做, 我用来插入值的代码是:

      private void btnInsert_Click(object sender, EventArgs e)
       {
        if (txtName.Text == string.Empty)
        {
            MessageBox.Show("Please enter a value to Project Name!");
            txtName.Focus();
            return;
        }
        if (txtContactPerson.Text == string.Empty)
        {
            MessageBox.Show("Please enter a value to Description!");
            txtContactPerson.Focus();
            return;
        }
        SqlConnection con = Helper.getconnection();
        con.Open();
        string commandText = "InsertClient";
        SqlCommand cmd = new SqlCommand(commandText, con);
        cmd.Parameters.AddWithValue("@Name", txtName.Text);
        cmd.Parameters.AddWithValue("@ContactPerson", txtContactPerson.Text);
        cmd.CommandType = CommandType.StoredProcedure;
        MessageBox.Show("Client details are inserted successfully");
        txtName.Clear();
        txtContactPerson.Clear();
        object Name = cmd.ExecuteNonQuery();
        con.Close();
        BindData();            
    }

如何避免通过 winform 在表中输入重复值

首先,可以使用唯一索引或约束来防止表中出现重复项。索引/约束可以与以下建议协同工作。如果您只使用唯一索引而不使用以下解决方案之一,则插入重复记录将引发错误,您需要在另一端处理该错误。

您可以检查记录是否存在并手动插入或更新:

create procedure MyProcedure
(
    @Name nvarchar(100),
    ...
)
as
    if not exists (select * from MyTable where Name = @Name)
    begin
        insert into MyTable (Name,...) values (@Name,...)
    end
    else
    begin
            update MyTable
            set ...
            where Name = @Name
    end

我倾向于允许用户尝试输入任何表面上有效的主键,如果它是重复的,那么将有一个异常,您可以捕获并显示给用户。

这样做的原因是您必须检查数据库中的现有键,因此您也可以通过尝试插入它并处理任何错误来执行此操作。

您可能会进一步改进验证和错误处理,在每个单独的问题上弹出一个消息框很烦人,最好对所有问题进行总结。此外,在显示消息框时保持打开数据库连接也可能不可取。

private void btnInsert_Click(object sender, EventArgs e)
   {
    if (txtName.Text == string.Empty)
    {
        MessageBox.Show("Please enter a value to Project Name!");
        txtName.Focus();
        return;
    }
    if (txtContactPerson.Text == string.Empty)
    {
        MessageBox.Show("Please enter a value to Description!");
        txtContactPerson.Focus();
        return;
    }
    SqlConnection con = Helper.getconnection();
    con.Open();
    string commandText = "InsertClient";
    SqlCommand cmd = new SqlCommand(commandText, con);
    cmd.Parameters.AddWithValue("@Name", txtName.Text);
    cmd.Parameters.AddWithValue("@ContactPerson", txtContactPerson.Text);
    cmd.CommandType = CommandType.StoredProcedure;
try
{
    object Name = cmd.ExecuteNonQuery();
    MessageBox.Show("Client details are inserted successfully");
    txtName.Clear();
    txtContactPerson.Clear();
    BindData();
}
catch(Exception ex)
{
        //Handle exception, Inform User
}
finally
{
        con.Close();
}      
}

我理解您的要求,我看到您正在询问使用自己的代码而不是异常。您可以使用 try catch 块来获取它。请尝试以下代码:

try
{
    object Name = cmd.ExecuteNonQuery();
    MessageBox.Show("Client details are inserted successfully");
    txtName.Clear();
    txtContactPerson.Clear();
    BindData();
}
catch(Exception ex)
{
    //Handle exception, Inform User
}
finally
{
    con.Close();
}      

我倾向于使用实体框架,因为在这种情况下它会引发异常,但是我想您可以先运行 sql 查询以检查它是否存在,或者尽管这可能会产生显着的性能开销