如何防止SQL数据库中的类似(重复)条目
本文关键字:重复 条目 何防止 SQL 数据库 | 更新日期: 2023-09-27 18:11:19
//CHECK IF COMPLETE DUPLICATE
query = "SELECT * FROM TBL_FLAVORS WHERE flavor_name = @flavor_name AND flavor_supplierid = @supplier_id";
using (SqlConnection con = new SqlConnection(connstring))
{
con.Open();
using (SqlCommand cmd = new SqlCommand(query, con))
{
SqlDataReader read;
cmd.Parameters.AddWithValue("@flavor_name", txtFlavorName.Text.ToString());
cmd.Parameters.AddWithValue("@supplier_id", supplierid);
read = cmd.ExecuteReader();
if (read.Read())
{
MessageBox.Show("This flavor for this supplier already exists.");
return;
}
read.Close();
}
}
//CHECK IF ALMOST SIMILAR
//IF RECORD FOUND, RETURN
//OTHERWISE, PROCEED TO UPDATE/INSERT
query = "SELECT * FROM TBL_FLAVORS WHERE (flavor_name LIKE @flavor_name OR flavor_name LIKE @flavor_name2 OR FLAVOR_NAME LIKE @flavor_name3) AND flavor_supplierid = @supplier_id";
using (SqlConnection con = new SqlConnection(connstring))
{
con.Open();
using (SqlCommand cmd = new SqlCommand(query, con))
{
string flavorname = "%" + txtFlavorName.Text.ToString()+ "%";
string flavorname2 = "" + txtFlavorName.Text.ToString() + "%";
string flavorname3 = "%" + txtFlavorName.Text.ToString() + "";
SqlDataReader read;
cmd.Parameters.AddWithValue("@flavor_name", flavorname);
cmd.Parameters.AddWithValue("@flavor_name2", flavorname2);
cmd.Parameters.AddWithValue("@flavor_name3", flavorname3);
cmd.Parameters.AddWithValue("@supplier_id", supplierid);
read = cmd.ExecuteReader();
if (read.Read())
{
DialogResult dialog = MessageBox.Show("It is possible that this flavor for this supplier already exists. Do you want to continue?", "", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (dialog == DialogResult.No)
{
return;
}
}
read.Close();
}
}
小组成员问,如果已经有一个"英寸",用户输入了一个"英寸"怎么办?它应该被认为是复制品。或者假设数据库中有一个'chocolate',如果用户输入'chocolate',它应该要求确认。
当我有类似的请求时,我决定使用Jaro-Winkler距离来测量两个字符串之间的相似性。
我用c#实现了它,并在SQL Server中创建了一个CLR函数。参见c#中的Jaro-Winkler距离算法。
在我的例子中,我想防止用户多次输入相同的公司名称,所以当用户想要创建一个新公司时,他必须首先输入新公司的名称,然后程序在数据库中搜索现有公司,并显示按"相关性"排序的发现结果,即Jaro-Winkler距离。它可以帮助用户选择一个现有的条目,而不是创建一个副本,即使输入的名称有一些拼写错误。
您将需要实现一些近似字符串匹配算法,该算法比使用"LIKE" sql语句时要聪明一点,以便能够检测在字母之间有字符的类似单词。
。如果使用LIKE '%INCH%'执行'INCHX'将返回TRUE但是' inch '将不匹配任何内容。
顺便说一下,参数flavour_name_2和flavour_name_3可能是多余的,因为两边带%的flavour_name将匹配在开头和结尾都有额外字符的单词。
近似字符串匹配:近似字符串匹配算法