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

に私は私は2つの文字列の間の類似性を測定するためにJaro–Winkler distanceを使用することを決めた同様の要求を持っていました。

私はC#でそれを実装し、SQL ServerでCLR関数を作成しました。例えば、Jaro–Winkler distance algorithm in C#を参照してください。

私の場合、ユーザーが同じ会社名を複数回入力するのを防ぎたかったので、新しい会社を作成する場合は、最初に新しい会社の名前を入力してから、既存の会社Jaro-Winklerの距離である「関連性」によって順序付けられた結果を表示します。これは、名前がいくつかのタイプミスで入力されたとしても、複製を作成するのではなく、既存のエントリの1つを選択するのに役立ちます。

1

と一致するおおよその文字列を実装する必要があります。このアルゴリズムは、 "LIKE" SQL文を使用した場合より少しスマートで文字間に文字を含む単語を検出することができます。

など。 LIKE '%INCH%'で実行した場合、 'INCHX'はTRUEを返します。 'INNCH'は何も一致しません。

ちなみに、パラメータflavour_name_2とflavour_name_3はおそらく冗長なので、両側に%が付いているflavour_nameは、開始と終了の両方で余分な文字と一致します。

近似文字列マッチング:Approximate string matching algorithms

+0

ああ、右、ありがとう、冗長性を指摘してくれてありがとう! :)私はリンクをチェックアウト:) – herondale

関連する問題