如何避免通过 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();
}
首先,可以使用唯一索引或约束来防止表中出现重复项。索引/约束可以与以下建议协同工作。如果您只使用唯一索引而不使用以下解决方案之一,则插入重复记录将引发错误,您需要在另一端处理该错误。
您可以检查记录是否存在并手动插入或更新:
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 查询以检查它是否存在,或者尽管这可能会产生显着的性能开销