2010-11-20 3 views
2

私のC#ボタンは、1つのテーブルにいくつかのデータを追加します。この行のIDを取得するにはどうすればよいですか?誰かがアイデアを持っていますか?ちょうど追加された行IDを取得する方法

private static void InsertIntoTransportation(string ZednadebNumber, DateTime DateTime, int SellerID, int BuyerID, string TransStart, string TransEnd, decimal Quantity, string LoadType, string LoadName, int DriverID, decimal Cost, decimal FuelUsed, decimal salary) 
    { 
     try 
     { 
      using (SqlCommand cmd = new SqlCommand("INSERT INTO Transportation (DriverID, ClientIDAsSeller, ClientIDAsBuyer, ZednadebNumber, LoadName, TransStart, TransEnd, LoadType, Quantity, Cost, FuelUsed, DateTime) VALUES (@DriverID, @ClientIDAsSeller, @ClientIDAsBuyer, @ZednadebNumber, @LoadName, @TransStart, @TransEnd, @LoadType, @Quantity, @Cost, @FuelUsed, @DateTime)", new SqlConnection(Program.ConnectionString))) 
      { 
       cmd.Parameters.AddWithValue("@DriverID", DriverID); 
       cmd.Parameters.AddWithValue("@ClientIDAsSeller", SellerID); 
       cmd.Parameters.AddWithValue("@ClientIDAsBuyer", BuyerID); 
       cmd.Parameters.AddWithValue("@ZednadebNumber", ZednadebNumber); 
       cmd.Parameters.AddWithValue("@LoadName", LoadName); 
       cmd.Parameters.AddWithValue("@TransStart", TransStart); 
       cmd.Parameters.AddWithValue("@TransEnd", TransEnd); 
       cmd.Parameters.AddWithValue("@LoadType", LoadType); 
       cmd.Parameters.AddWithValue("@Quantity", Quantity); 
       cmd.Parameters.AddWithValue("@Cost", Cost); 
       cmd.Parameters.AddWithValue("@FuelUsed", FuelUsed); 
       cmd.Parameters.AddWithValue("@DateTime", DateTime); 
       cmd.Connection.Open(); 
       cmd.ExecuteNonQuery(); 
       SqlCommand cmd1 = new SqlCommand("INSERT INTO Salary (DriverID, TransportationID, Salary) VALUES (@DID, @@IDENTITY, @Salary)", new SqlConnection(Program.ConnectionString)); 
       cmd1.Parameters.AddWithValue("@DID", DriverID); 
       cmd1.Parameters.AddWithValue("@Salary", salary); 
       cmd1.Connection.Open(); 
       cmd1.ExecuteNonQuery(); 
       cmd1.Connection.Close(); 
       cmd.Connection.Close(); 
      } 
     } 
     catch (Exception) 
     { 

      MessageBox.Show("ვერ ვახერხებ მონაცემთა ბაზასთან კავშირს, დაწრმუნდით თქვენი კომპიუტერის ინტერნეტთან კავშირის გამართულობაში.", "შეცდომა !!!", MessageBoxButtons.OK, MessageBoxIcon.Error); 
     } 
    } 
+0

コードを投稿できますか?データを追加する方法を確認するにはコードを参照する必要がありますか?行ごとに追加するか、リストを追加しますか?あなたのID列(int、uniqueidentifier、nvarchar)のタイプは何ですか?どうやって? –

答えて

4

私のC#ボタンは、 テーブルにデータを追加しています。この行のIDを取得するにはどうすればよいですか?誰でも知っている人は ですか?

提供されたコード例は、2行を挿入します。

どちらの方法でも、最後に "; SELECT SCOPE_IDENTITY()"を含むようにステートメントを変更し、コマンドからスカラー結果を取得するだけです。あなたの行IDは、標準整数フィールド(よりむしろBIGINT)であると仮定すると

// Edit your command text to have "; SELECT SCOPE_IDENTITY()" at the end. 
int? insertedId = cmd.ExecuteScalar() as int?; 
if (insertedId.HasValue) 
{ 
    // success! 
} 

(注)行は、整数/ BIGINTをインクリメント自動を使用していない場合、これは機能しないこと。

また、テスト/サンプルコード以外のものであれば、ステートメントをストアドプロシージャに移動することを強くお勧めします。

C#からSQLコードを分離することは、共通の文を再利用できることを意味します(それらをメソッドと見なします)。あるいは、ORMソリューションの使用を検討してください。

+0

私のためにその仕事に感謝 –

-1

一部の私の同僚の開発者は、ID値を返すために挿入後にクエリを実行します。 DBAとして、Alexander氏が示すように他の方法もあります。クエリはネットワーク上で余分なIOを生成しますが、少なくともキャッシュには存在し、ディスクIOはこれ以上発生しません。

+2

挿入された値を調べるためにクエリを実行すると、これらのプロセスのうちの2つ以上が同時に動作している場合、競合状態になります。代わりに、提供されたSCOPE_IDENTITY機能を使用して、生成されたIDを1回のアトミック操作で戻します。例については私の答えを見てください。 –

+0

私はAlexanderと同意してデュアルクエリーを提案しようとしていないので、これをコメントに入力しておきたいと思います。 –

1

MS SQL Serverでは、私の好みはoutput clauseです。あなたは非問合せを実行しないでしょう、それは読者になります(それは技術的には挿入物ですが)。挿入物の結果セットには、選択したフィールドに1つの行が含まれます。これは、続く更新が必要なROWVERSION(TIMESTAMP)列を持っている場合に便利です(別の読込みを禁止します)。

編集 - OUTPUT INTOではなくOUTPUTを使用します(これはC#よりもSQL Server側のコードで便利です)。

これはscope_identity(トリガーの代わりに別のスコープを使用してnullを返す)、@@ identityおよびそのすべての問題とは対照的に、sprocsおよびトリガーにも有効です。

関連する問題