2017-01-07 8 views
1

ねえ、私はこの人に助けが必要です。私がここでやろうとしているのは、自分のwinformのデータエントリに基づいてメンバの名前を使ってメンバがすでに存在する場合、mysql dbをチェックすることです。重複エントリの検証は、メッセージボックスを完全に私が望む方法で表示しますが、既存のメンバーが見つからない場合に作成された挿入クエリを実行しません。C#重複したエントリをチェックし、重複がなければinsertクエリを実行します。

これを正しく実行していますか?または私が望むようにそれを稼働させる別の方法があります。あなたが準備されたステートメントを使用する方法を知っているように見える

private void metroButton1_Click(object sender, EventArgs e) { 
    using (con = new MySqlConnection(constring)) {  
     string selectquery = "SELECT * FROM sbis.sb_members WHERE lname ='" + this.lnametxtbox.Text + "' AND fname = '" + this.fnametxtbox.Text + "' AND mname ='" + this.mnametxtbox.Text + "' "; 
     MySqlCommand command2 = new MySqlCommand(selectquery, con); 

     string insertquery = "INSERT INTO sbis.sb_members (lname, fname, mname, position, appointment, address, contactnum, birthdate, civilstatus, educattainment, eligibility, terms_idterms, polparties_id, sex) VALUES (@lname, @fname, @mname, @position, @appointment, @address, @contactnum, @birthdate, @civilstatus, @educattainment, @eligibility, @terms_idterms, @polparties_id, @sex)"; 
     MySqlCommand cmd = new MySqlCommand(insertquery, con); 
     string lname, fname, mname, address, contactnum, educattainment; 

     lname = lnametxtbox.Text; 
     fname = fnametxtbox.Text; 
     mname = mnametxtbox.Text; 
     address = addresstxtbox.Text; 
     contactnum = contacttxtbox.Text; 
     educattainment = eductxtbox.Text; 
     var birthdate = birthdatedtp.Value.Date; 

     cmd.Parameters.AddWithValue("@lname", lname); 
     cmd.Parameters.AddWithValue("@fname", fname); 
     cmd.Parameters.AddWithValue("@mname", mname); 
     cmd.Parameters.AddWithValue("@address", address); 
     cmd.Parameters.AddWithValue("@contactnum", contactnum); 
     cmd.Parameters.AddWithValue("@position", position); 
     cmd.Parameters.AddWithValue("@appointment", appointment); 
     cmd.Parameters.AddWithValue("@birthdate", birthdate); 
     cmd.Parameters.AddWithValue("@sex", sex); 
     cmd.Parameters.AddWithValue("@eligibility", eligibility); 
     cmd.Parameters.AddWithValue("@civilstatus", civilstatus); 
     cmd.Parameters.AddWithValue("@terms_idterms", terms); 
     cmd.Parameters.AddWithValue("@polparties_id", polparties); 
     cmd.Parameters.AddWithValue("@educattainment", educattainment); 

     try { 
      con.Open(); 
      MySqlDataReader cr = command2.ExecuteReader(); 
      while (cr.Read()) { 
       if (cr.HasRows == true) { 
        MessageBox.Show("Member already exists.", "Duplicate Entry", MessageBoxButtons.OK, MessageBoxIcon.Warning); 
       } else if (cr.HasRows == false) { 
        if (cmd.ExecuteNonQuery() > 0) { 
         MessageBox.Show("Saved", "Save", MessageBoxButtons.OK, MessageBoxIcon.Information); 
        } 
       } 
      } 
      cr.Close();  
     } catch (Exception ex) { 
      MessageBox.Show(ex.Message); 
     } 
    } 
} 

答えて

2

は、ここに私のコードです。だからあなたのSELECTで文字列連結を使用しているのは謎です

string selectquery = "SELECT * FROM sbis.sb_members WHERE lname ='" + this.lnametxtbox.Text + "' AND fname = '" + this.fnametxtbox.Text + "' AND mname ='" + this.mnametxtbox.Text + "' "; 

しかし、良いことに、このSELECTはまったく必要ないということです。あなたはただそれを捨てることができます。また、mysqlのIGNORE機能を利用してください。または、そのメンバーが既に存在することを示すメッセージを表示したい場合は、例外をキャッチしてください!

using (con = new MySqlConnection(constring)) 
    { 

     string insertquery = "INSERT INTO sbis.sb_members (lname, fname, mname, position, appointment, address, contactnum, birthdate, civilstatus, educattainment, eligibility, terms_idterms, polparties_id, sex) VALUES (@lname, @fname, @mname, @position, @appointment, @address, @contactnum, @birthdate, @civilstatus, @educattainment, @eligibility, @terms_idterms, @polparties_id, @sex)"; 
     MySqlCommand cmd = new MySqlCommand(insertquery, con); 
     string lname, fname, mname, address, contactnum, educattainment; 


     lname = lnametxtbox.Text; 
     fname = fnametxtbox.Text; 
     mname = mnametxtbox.Text; 
     address = addresstxtbox.Text; 
     contactnum = contacttxtbox.Text; 
     educattainment = eductxtbox.Text; 
     var birthdate = birthdatedtp.Value.Date; 

     cmd.Parameters.AddWithValue("@lname", lname); 
     cmd.Parameters.AddWithValue("@fname", fname); 
     cmd.Parameters.AddWithValue("@mname", mname); 
     cmd.Parameters.AddWithValue("@address", address); 
     cmd.Parameters.AddWithValue("@contactnum", contactnum); 
     cmd.Parameters.AddWithValue("@position", position); 
     cmd.Parameters.AddWithValue("@appointment", appointment); 
     cmd.Parameters.AddWithValue("@birthdate", birthdate); 
     cmd.Parameters.AddWithValue("@sex", sex); 
     cmd.Parameters.AddWithValue("@eligibility", eligibility); 
     cmd.Parameters.AddWithValue("@civilstatus", civilstatus); 
     cmd.Parameters.AddWithValue("@terms_idterms", terms); 
     cmd.Parameters.AddWithValue("@polparties_id", polparties); 
     cmd.Parameters.AddWithValue("@educattainment", educattainment); 

     try 
     { 
      if (cmd.ExecuteNonQuery() > 0) 
      { 
        MessageBox.Show("Saved", "Save", MessageBoxButtons.OK, MessageBoxIcon.Information); 
      } 
     } 
     catch (Exception ex) 
     { 
      if (ex.Message.ToLower().Contains("duplicate key")) 
      { 
        MessageBox.Show("Member already exists.", "Duplicate Entry", MessageBoxButtons.OK, MessageBoxIcon.Warning); 
      } 
      else { 
        MessageBox.Show(ex.Message); 
      } 
     } 
    } 
} 

上記の例では、エラーを無視する代わりに、ユーザーが存在するというメッセージを表示するために、重複キーエラーをキャッチしています。

もちろん、これは複製する必要のない列にUNIQUEまたはPRIMARY KEYという制約を作成したことを前提としています。これはデータベース設計の基本的な部分です。そして、標準レベルでは、アプリケーションレベルで行うのではなく、一意性やその他の制約を適用するのではなく、データベースに依存することです

+0

返信いただきありがとうございます。私はINSERT IGNOREを試しましたが、私は保存するたびに重複したエントリを取得します。 – nolimits

+0

本当にありがとうございました。 – nolimits

+0

あなたのプロジェクトで全力を尽くしてくれたことをうれしく思います。 – e4c5

0

while (cr.Read())は、(読み取り)テーブルが空(重複しない)走る

しかし、あなたは競争条件があるので、アプローチは悪いです。何もないことを確認した後に誰かが行を挿入するとどうなりますか?実際に制約を適用するには、

ALTER TABLE sbis.sb_members ADD UNIQUE (lname, fname, mname) 

を今すぐ追加してください。重複しても安全です。

+0

あなたの考えに感謝し、本当に感謝します。 – nolimits

関連する問題