2011-05-06 67 views
22

我有一個INSERT查詢,我希望數據庫返回我剛剛插入的行的ID。INSERT返回ID?

sqlString = "INSERT INTO MagicBoxes (OwnerID, Key, Name, Permissions, Active, LastUpdated) VALUES (@OwnerID, @BoxKey, @BoxName, 0, 1, @Date) SET @ID = SCOPE_IDENTITY();"; 
cmd = new SqlCommand(sqlString, con); 
cmd.Parameters.AddWithValue("@OwnerID", OwnerID); 
cmd.Parameters.AddWithValue("@BoxKey", BoxKey); 
cmd.Parameters.AddWithValue("@BoxName", BoxName); 
cmd.Parameters.AddWithValue("@Username", Username); 
cmd.Parameters.AddWithValue("@Date", DateTime.Now); 
cmd.ExecuteNonQuery(); 

目前,我有這個,我不知道我下一步需要做...

+0

不能讓你的問題,你要行的種子值剛插入? – 2011-05-06 11:01:39

回答

31

你只需要@ID添加到PARAMS集合,然後檢索它這個樣子,

cmd.Parameters.Add("@ID", SqlDbType.Int, 4).Direction = ParameterDirection.Output; 
cmd.ExecuteNonQuery(); 
//Now just read the value of: cmd.Parameters["@ID"].value 

或者,如果你喜歡這樣的語法:

SqlParameter param = new SqlParameter("@ID", SqlDbType.Int, 4); 
param.Direction = ParameterDirection.Output; 
cmd.Parameters.Add(param); 
+0

'參數4:無法從'System.Data.ParameterDirection'轉換爲'string'' – Danpe 2011-05-06 11:04:12

+0

@Danpe = apologies,以上糾正 - 我總是發現增加輸出參數比它需要更笨重 – AdaTheDev 2011-05-06 11:15:41

+2

我不能做這項工作,在執行命令後參數爲空。這裏的另一個答案使用ExecuteScalar,似乎產生了正確的值。具有存儲過程的 – 2013-12-31 03:29:51

20

你有兩個選擇;您可以聲明Output參數,稱爲@ID;或者 - 你可以結束更改爲SELECT SCOPE_IDENTITY(),只需使用:

int id = (int)cmd.ExecuteScalar(); 

我喜歡的形式參數的方法,但ExecuteScalar效果很好。

3

這爲您的參數

SqlParameter IDParameter = new SqlParameter("@ID",SqlDbType.Int); 
IDParameter.Direction = ParameterDirection.Output; 
cmd.Parameters.Add(IDParameter); 

添加執行可以檢索ID

int id = (int)IDParameter.Value; 
0

你爲什麼不調用存儲過程後。將值傳遞給存儲過程以獲取插入的值並從SP返回使用SCOPE_IDENTITY().插入的最後一個種子值希望得到此幫助。

+0

不會改變任何內容;這是關於參數/結果傳遞,這將是相同的 – 2011-05-06 11:32:25

+0

是的,你是對的,我的意思是說,調用SP並從SP返回插入後的最後一個種子值。 – 2011-05-06 11:35:13

12

由於SQL Server 2008中有一個OUTPUT clause添加到TSQL的語法。這使您可以將受DML查詢影響的數據添加到表格數據流中。

儘管在查詢返回正確的信息後查詢SCOPE_IDENTITY(),它強制SQL Server執行2個查詢,其中輸出子句將其限制爲一個查詢。

知道了這一點,正在執行的查詢可以改變如下(假設[Id]是標識的名稱):

INSERT INTO MagicBoxes (OwnerID, [Key], Name, [Permissions], Active, LastUpdated) 
OUTPUT INSERTED.Id 
VALUES (@OwnerID, @BoxKey, @BoxName, 0, 1, @Date) 

的另一個問題是無法處置的SqlCommand的。 ADO.net中的大多數Sql...對象實現了IDisposable,應該妥善處理。

帶來一切融合在一起我會實現如下這段代碼:

 using (var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["db"].ConnectionString)) 
     using (var cmd = new SqlCommand(@" 
       INSERT INTO MagicBoxes (OwnerID, [Key], Name, [Permissions], Active, LastUpdated) 
       OUTPUT INSERTED.Id 
       VALUES (@OwnerID, @BoxKey, @BoxName, 0, 1, @Date) ", conn)) 
     { 
      cmd.Parameters.AddRange(new[] 
       { 
        new SqlParameter("@OwnerID", SqlDbType.Int).Value = OwnerID, 
        new SqlParameter("@BoxKey", SqlDbType.VarChar).Value = BoxKey, 
        new SqlParameter("@BoxName", SqlDbType.VarChar).Value = BoxName, 
        new SqlParameter("@Date", SqlDbType.DateTime).Value = DateTime.Now 
       }); 

      conn.Open(); 

      var id = (int)cmd.ExecuteScalar(); 
     } 
+1

這是最好的答案。 – 2018-01-24 18:26:56