如何在将名称添加到数据库之前检查重复的名称

  • 本文关键字:添加 数据库 c# sql-server
  • 更新时间 :
  • 英文 :


在输入数据库之前创建以检查重复的名称(

private void btn_Submit_Click(object sender, EventArgs e)
{
con.Open();
SqlCommand cmd = con.CreateCommand();
if (txt_Name.Text == "Employee")
{
cmd.ExecuteNonQuery();
con.Close();
display_data();
MessageBox.Show("Name existed");
}
else
{
cmd.CommandType = CommandType.Text;
cmd.CommandText = "insert into Employee values('" + txt_Name.Text + "','" + txt_Contact.Text + "','" + txt_Address.Text + "','" + txt_Email.Text + "','" + txt_Password.Text + "')";
cmd.ExecuteNonQuery();
con.Close();
display_data();
MessageBox.Show("Inserted successfully");
}
}

将字符串与参数连接是security risk,请使用sqlcommand参数https://learn.microsoft.com/de-de/dotnet/api/system.data.sqlclient.sqlcommand.parameters?view=dotnet-plat-ext-6.0

示例:

var query = "INSERT INTO Employee VALUES (@name, @contact, @address, @email, @password)";
cmd.CommandText = query;
cmd.Parameters.AddWithValue("@name", txt_Name.Text);
cmd.Parameters.AddWithValue("@contact", txt_Contact.Text);
cmd.Parameters.AddWithValue("@address", txt_Address.Text);
cmd.Parameters.AddWithValue("@email", txt_Email.Text);
cmd.Parameters.AddWithValue("@password", txt_Password.Text);

有几种方法可以达到你的问题的目标

  • 唯一索引
    您可以在表上添加unique index,这在执行命令时引发异常

  • Transact-SQL
    还可以将整个验证逻辑移动到数据库服务器https://dba.stackexchange.com/questions/125886/check-if-a-user-exists-in-a-sql-server-database

IF NOT EXISTS (SELECT * FROM Employee WHERE Name = @name)
BEGIN
INSERT INTO Employee VALUES (@name, @contact, @address, @email, @password)
END
  • 插入前查询
    按名称使用筛选器执行第二个查询,并检查是否存在行。然而,这并不是一种绝对的保护。在并行执行的情况下,重复数据仍然可能发生

    如果启动事务,您可以保护此块,但这会限制其他用户在此期间访问数据库。https://learn.microsoft.com/en-us/sql/relational-databases/sql-server-transaction-locking-and-row-versioning-guide?view=sql-服务器版本16

您可以获得具有相同名称的行数。如果大于零,请不要添加新行。。。但更好的方法是为sql中的name列创建一个UNIQUE INDEX,比如:

CREATE UNIQUE INDEX uidx_pid
ON Employee(name);

然后在c#代码上:

string sqlQuery = "insert into Employee values('" + txt_Name.Text + "','" + txt_Contact.Text + "','" + txt_Address.Text + "','" + txt_Email.Text + "','" + txt_Password.Text + "')";
using (SqlConnection con = new SqlConnection(conString))
{
using (SqlCommand cmd = new SqlCommand(sqlQuery , con))
{
try
{
con.Open();
cmd.ExecuteNonQuery();
display_data();
MessageBox.Show("Inserted successfully");
}
catch(Exception ex) {
display_data();
MessageBox.Show("Name existed");
};

}
}

最新更新