2017-06-15 4 views
1

整数をプライマリキーとして持つテーブルにデータを挿入したいとします。主キーは、広範囲の乱数によって追加されます。まず、プライマリキーが存在するかどうかを確認してから挿入します。数が、私は成功し、データベースに新しい行を挿入することができます重複していない場合SQLサーバーテーブルに既存のプライマリキーを追加しない

public static void Insert() 
    { 
     bool a=true; 

     while (a != false) 
     { 


      try 
      { 
       db.test.Add(new test() //insert into test table new data 
       { 

        Id = rand.Next(1, 10), 
        name = "test", 
        surname = "test" 
       }); 

       db.SaveChanges(); 
       a=false; 
      } 
      catch (Exception) 
      { 

       Console.WriteLine("Duplicate"); 

      } 


     } 
    } 

最初の反復で:

は、ここに私のコードです。最初の反復では、の後に重複するエントリがある場合は、私は直接catchにジャンプします。しかし、問題は、2番目の反復で乱数が重複しない場合に、a=false行のコードを実行せずに例外をキャッチするためにジャンプするときに発生します。

注:GUIDや他のデータ型の使用には興味がありません。

+1

自分自身を挿入しないでください。代わりにIDを使用し、データベースにIDを生成させます。 –

+0

@ User.Anonymous私はその解決策にも興味がありません。 –

+0

@MrASDまあ...例外は何と言うの?また、重複が検出された後で*これは起こりますか?初めて挿入することができなければ、それは 'db'に対する変更としてカウントされるので、それ以降はそれを挿入するように試みるでしょう* –

答えて

2

乱数を必要としない方が簡単な解決策になるかもしれません。

CREATE TABLE Persons (
    ID int IDENTITY(1,1) PRIMARY KEY, 
    Surname varchar(255) NOT NULL, 
    Name varchar(255) 
); 

INSERT INTO Persons (Name,Surname) 
VALUES ('Lars','Monsen'); 

あなたもPRIMARY KEYで何もする必要はありません。この方法で、SQL Serverは、あなたのためにそれを処理します!

+0

ありがとうございます: "私はその解決にも興味がありません" - 私はあなたに完全に同意します。これはプライマリキーの生成を行う正しい方法です –

+0

私はちょうどあなたがこれをしたいと思う解決策を私の頭を傷つけています。また、私はOPのポストへの前のコメントを見ませんでした。 –

+1

私はあなたが意味することを知っています。私は明らかに彼らの問題を解決したという点で、少し罪悪感を感じます。隠喩に切り替えるには、誰かが自分の足でショットガンを指差していて、それを発射できなかったように感じています。一口。 –

2

ここでの問題は、重複したキーが生成されると挿入が失敗するため、は毎回を挿入しようとします。 OP:

はい、正確には、重複を検出すると、次の番号が重複していなくても試し続けます。

これを解決するための3つの主な方法があります。

  1. 独自のキーを生成しません。申し訳ありませんが、これはここで最も簡単で、最も明白で、最も支持的な仕組みです。あなたが何かを挿入するためにに失敗場合IDENTITYはあなたの友達
  2. です:あなたは失敗を保持しませんので、あなたのORMの文脈からその同じものを除きます。おそらくdb.test.Removeメソッドがあります。最後の行の値を変更することもできます。その行が最後の行であることがわかっていることを悪用してください:db.test.Last().Id = newId; - これは非常に奇妙です。
  3. またはは、失敗後にデータコンテキストを再利用し続けることはありません。;例外の後にdbが使用できなくなったと仮定し、その後の操作のために新しいものを作成します。 IMOこれは最初に "再起動から"方法でdbコンテキストを作成したのと同じコードで行う必要があります
+0

データベース自体が使用できないことに感謝して、何が起こっているのか理解できました。私はあなたの選択肢3を選んだが、今はすべてが機能する。ありがとうございました! –

関連する問題