2016-10-04 119 views
1
//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(); 
     } 
} 

小组成员询问如果已经有一个“英寸”并且用户输入了“innch”。它应该被认为是重复的。或者说数据库中有一个'巧克力',如果用户输入'巧克力',它应该要求确认。如何防止SQL数据库中的类似(重复)条目?

回答

2

当我有一个类似请求我决定使用Jaro–Winkler distance测量两个串之间的相似性。

我在C#中实现了它,并在SQL Server中创建了一个CLR函数。例如,请参见Jaro–Winkler distance algorithm in C#

在我的情况下,我想阻止用户多次输入同一个公司名称,所以当用户想要创建一个新公司时,他必须先键入新公司的名称,然后该程序在现有公司中搜索在数据库中显示按“Jaro-Winkler距离”的“相关性”排序的搜索结果。它有助于用户选择其中一个现有条目,而不是创建副本,即使该名称是用一些拼写错误输入的。

1

您将需要实现一些近似字符串匹配算法,该算法比您使用“LIKE”sql语句能够检测到具有字母之间的字符的类似单词更聪明。

E.g.如果您使用LIKE'%INCH%' 执行但'INNCH'不匹配任何内容,'INCHX'将返回TRUE。

顺便说一下,参数flavour_name_2和flavour_name_name_3可能是多余的,因为flavour_name和%都会在开始和结束时匹配具有额外字符的单词。

近似串匹配:Approximate string matching algorithms

+0

哦,对,正确,谢谢指出(冗余)! :)我会检查出链接:) – herondale