2011-12-04 9 views
8

私はクエリを実行し、成功するとtrueを返し、失敗するとfalseを返します。いいえ、メソッドを拡張して、挿入されたすべての挿入クエリでクラスvar insertIdに最後に挿入された行のIDが含まれるようにしました。SQL Server ExecuteScalar()は最後に挿入されたIDを返しません

問題はinsertIdは常に0なので、何とかexecuteScalar()がIDを返さないということです。

アイデア?それが動作しない場合や、他のソリューションを使用すると、テーブルのスキーマとINSERTクエリあなたを投稿することができ、@@ IDENTITYの代わりに)最後の挿入クエリのID ....

public int insertId;   

    public bool executeCommand(string q) { 
     q += "; SELECT @@IDENTITY AS LastID"; 
     bool retour = true; 
     SqlConnection myCon = new SqlConnection(Settings.DSN); 
     SqlCommand cmd = new SqlCommand(q, myCon); 
     try { 
      cmd.Connection.Open(); 
      insertId = (int)cmd.ExecuteScalar(); 
      if (insertId > 0) { 
       MessageBox.Show(insertId.ToString()); 
      } 

      myCon.Close(); 
     } catch (Exception ex) { 
      this.error = ex.Message; 
      retour = false; 
     } 
     return retour; 
    } 

答えて

17

INSERTを変更して、挿入したIDをすぐに返却するようにしてください(OUTPUT句)!これはSQL Server 2005で動作します - OUTPUT句はSQL Server 2000以前では使用できません(ご質問で使用しているのバージョンを指定していません...)。 OUTPUT clause on MSDN Books Onlineについて詳しくはこちらをご覧ください。

INSERT INTO dbo.YourTable(Col1, Col2, ..., ColN) 
OUTPUT Inserted.ID 
VALUES(Val1, Val2, ..., ValN); 

、あなたがC#のからあなたのINSERT文を実行するときに、あなたが行うことができるはず:

のようなものであるためにあなたのインサートを変更

using(SqlCommand cmdInsert = new SqlCommand("INSERT.....", myCon)) 
{ 
    myCon.Open(); 
    var result = cmdInsert.ExecuteScalar(); 
    myCon.Close(); 
} 

とあなたのresult変数が今すべき新しく挿入された適切な値を含んでいます!

+1

私は2005バージョンを使用しています...これを試してみるつもりですが、すべての挿入クエリが既に書かれているので、いくつかの作業になるでしょう...編集:ありがとうございます!これはうまくいきました。結果には挿入された行のIDが入ります – jhoevenaars

+0

ありがとうございます。しかし、Inserted.IDはID列のInserted.nameを意味することを忘れないでください。 –

+0

Muchas gracias、funciona de maravilla:D – cheloncio

2

するTry SCOPE_IDENTITYを(取得します走っている。

関連する問題