3

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

      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();            
    }
4

4 回答 4

3

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

这样做的原因是您必须检查数据库中的现有密钥,因此您不妨尝试插入它并处理任何错误。

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

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();
}      
}
于 2013-09-19T09:34:45.310 回答
2

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

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

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
于 2013-09-19T09:44:13.313 回答
2

我了解您的要求,我看到您在询问使用自己的代码而不是异常。您可以使用 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();
}      
于 2013-10-01T05:52:39.200 回答
1

我倾向于使用实体框架,因为在这种情况下它会抛出异常,但是我想你可以先运行一个 sql 查询来检查它是否存在,或者尽管这样做可能会有很大的性能开销

于 2013-09-19T09:28:38.603 回答