2017-11-21 3 views
0

bağlanti.Open();C#を使用して値を挿入したときに値が既にデータベースに存在するかどうかを確認するには

 SqlCommand komut = new SqlCommand("insert into RezervasyonKayıt (Rezervasyon_İçerik,Yemek_Tercihi,Kişi_Sayısı,İçecek_Tercihi,Giris_Ekstraları,Yetkili_Kisi,Rezervasyon_Tarihi)values(@İçerik,@Yemek,@Kisi,@İcecek,@Giris,@Yetkili,@RezTarih)", bağlanti); 
     komut.Parameters.AddWithValue("@İçerik", comboBox1.SelectedItem); 
     komut.Parameters.AddWithValue("@Yemek", comboBox2.SelectedItem); 
     komut.Parameters.AddWithValue("@Kisi", comboBox3.SelectedItem); 
     komut.Parameters.AddWithValue("@İcecek", comboBox4.SelectedItem); 
     komut.Parameters.AddWithValue("@Giris", comboBox5.SelectedItem); 
     komut.Parameters.AddWithValue("@Yetkili", comboBox6.SelectedItem); 
     komut.Parameters.AddWithValue("@RezTarih", dateTimePicker1.Value); 
     komut.ExecuteNonQuery(); 
     comboBox1.Text = ""; 
     comboBox2.Text = ""; 
     comboBox3.Text = ""; 
     comboBox4.Text = ""; 
     comboBox5.Text = ""; 
     comboBox6.Text = ""; 
     bağlanti.Close(); 
     XtraMessageBox.Show("Randevu Başarıyla Kayıt Edilmiştir", "Bilgi Mesajı", MessageBoxButtons.OK, MessageBoxIcon.Information); 

イムそれは私が(メッセージボックスに表示されるデータベースに存在している場合にのみRezervasyon_Tarihiをチェックしようとしている「すでにこの日付でRezervasyonが存在している! 『;

文字列CMD = SELECT COUNT(』 @ * )RezervasyonKayıtどこからRezervasyon_Tarihi = @ RezTarih)); ";

 komut=new SqlCommand(cmd,bağlanti); 
     komut.Parameters.AddWithValue("@RezTarih",dateTimePicker1.Value); 
     bağlanti.Open(); 
     int records=(int)komut.ExecuteScalar(); 

     if (records==0) 
     { 
      komut.Parameters.Clear(); 
      [email protected]"insert into RezervasyonKayıt (Rezervasyon_İçerik,Yemek_Tercihi,Kişi_Sayısı,İçecek_Tercihi,Giris_Ekstraları,Yetkili_Kisi,Rezervasyon_Tarihi)values(@İçerik,@Yemek,@Kisi,@İcecek,@Giris,@Yetkili,@RezTarih)"; 
      komut=new SqlCommand(cmd,bağlanti); 
      komut.Parameters.AddWithValue("@İçerik", comboBox1.SelectedItem); 
      komut.Parameters.AddWithValue("@Yemek", comboBox2.SelectedItem); 
      komut.Parameters.AddWithValue("@Kisi", comboBox3.SelectedItem); 
      komut.Parameters.AddWithValue("@İcecek", comboBox4.SelectedItem); 
      komut.Parameters.AddWithValue("@Giris", comboBox5.SelectedItem); 
      komut.Parameters.AddWithValue("@Yetkili", comboBox6.SelectedItem); 
      komut.Parameters.AddWithValue("@RezTarih", dateTimePicker1.Value); 
      komut.ExecuteNonQuery(); 
      comboBox1.Text = ""; 
      comboBox2.Text = ""; 
      comboBox3.Text = ""; 
      comboBox4.Text = ""; 
      comboBox5.Text = ""; 
      comboBox6.Text = ""; 

      XtraMessageBox.Show("Randevu Başarıyla Kayıt Edilmiştir", "Bilgi Mesajı", MessageBoxButtons.OK, MessageBoxIcon.Information); 
     }else 
     { 
      Response.Write("Records Exists"); 
     } 
+2

次に選択してください。 – OldProgrammer

答えて

1

新しい行を挿入しようとする前に、特定のキー/レコードの存在を確認できます。 など。 「SELECT count(*)」型の文を事前に実行して、同じ値のレコードがすでに存在することを確認することができます。この数が0より大きい場合、エラーメッセージが表示されます。

非常にトランザクション性の高いシステムでは、チェックを実行してから新しいレコードを挿入しようとする瞬間(数ミリ秒後)に新しいレコードが挿入されることがあります。したがって、1つのトランザクションに2つのステートメントをラップするか、コード内でこのシナリオを処理できるようにすることができます。

UNIQUE制約を追加して、その種類のレコードが1つしかテーブルに存在しないようにすることもできます。 詳細情報:Violation of UNIQUE KEY constraint on INSERT WHERE COUNT(*) = 0 on SQL Server 2005

+0

私の質問を編集しました int records =(int)komut.ExecuteScalar(); System.Data.dllに 'System.Data.SqlClient.SqlException'型の未処理の例外が発生しました。 – BruceWayne61

+0

これは適切な推奨事項です(両方のステートメントを1つのトランザクションでラップします)。 – Guilherme

+0

この変数の値がどのようになっているか確認してください:@RezTarih - SELECTクエリにプラグインする方法が間違っていると思います。 SELECTステートメントが有効であることを確認してください(特にWHERE句)。また、なぜあなたは最後の2つの閉じ括弧が必要ですか? – DmitryK

1

挿入の前に選択要求を挿入して、挿入するエントリがすでに存在するかどうかを確認できます。

+0

挿入前に選択すると競合状態が発生する可能性があります... – Guilherme

1

二つの方法あなたは競合状態が推奨される方法がある。この

ために起こる可能性に注意してください、あなたが挿入する前に、それは

最初に選択を行うことです

SELECT COUNT(*) FROM .... WHERE .... SOMEID = SOMETHING 

ような何かを行うことができますIDに一意のキーを定義すると、重複した一意キーの例外が原因で挿入が失敗します。その例外をキャッチしてmsgboxを表示する

+0

トランザクションを使用しない限り、競合状態が発生する可能性があるため、この方法はお勧めできません。 – Guilherme

+0

@Guilherme thxは指摘しています。ユニークキーが推奨された方法であることを示す答えを編集しました – Steve

関連する問題