2011-12-04 38 views
8

我有以下函數執行查詢,並在失敗時返回true和false。不,我想擴展該方法,以便在每個插入查詢被觸發時,類var insertId包含最後插入的行的ID。C#+ SQL Server ExecuteScalar()不返回上次插入的編號

問題是insertId始終爲0,所以executeScalar()不知何故返回該ID。

任何想法?或者其他的解決方案,以獲得最後的INSERT查詢的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或更低版本中不可用(您未指定在您的問題中使用的SQL Server的版本 ...)。詳細瞭解OUTPUT clause on MSDN Books Online

更改您的插入是這樣的:

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

,然後當你執行從C#您的插入語句,你應該能夠做到:

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

,現在你result變量應包含適當的,新插入的值!

+1

我使用的是2005版本...我要試試這個,但是這將會是一些工作,因爲所有的插入查詢都已經寫好了......編輯:謝謝!這工作,結果現在包含插入行的編號 – jhoevenaars

+0

非常感謝。但請記住,Inserted.ID意味着ID列的Inserted.name :) –

+0

Muchas gracias,funciona de maravilla:D – cheloncio

2

嘗試SCOPE_IDENTITY()代替@@ IDENTITY的,如果不工作,你可以發佈表架構和插入查詢你正在跑步。