2016-10-04 89 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