2011-05-24 42 views
18
public static void CreateSocialGroup(string FBUID) 
{ 
    string query = "INSERT INTO SocialGroup (created_by_fbuid) VALUES (@FBUID); SELECT @@IDENTITY AS LastID"; 

    using (SqlConnection connection = new SqlConnection(ConnectionString)) 
    { 
     SqlCommand command = new SqlCommand(query, connection); 
     command.Parameters.AddWithValue("@FBUID", FBUID); 

     connection.Open(); 
     command.ExecuteNonQuery(); 
    } 
} 

這是正確的方法嗎?我如何得到一個變量的LastID?謝謝SQL Server和C#:得到最後插入的ID

+0

可能重複(http://stackoverflow.com/questions/ 5228780 /如何獲取最後插入的ID) – 2014-08-13 08:07:52

回答

3

你可以嘗試ExecuteScalar獲取LastID值。

+0

工程,但我得到2行插入,爲什麼? – Johan 2011-05-24 11:40:52

+0

@Johan:SQL Profiler顯示什麼? – Richard 2011-06-27 08:51:39

-16
SqlCommand command = new SqlCommand("select max(id) from SocialGroup ", connection); 
int lastId = (int)command.ExecuteScalar(); 
+2

MAX(id)可能不是正確的方法。如其他地方所建議的SCOPE_IDENTITY()更好。 – 2011-05-24 11:36:58

+2

-1可能是我見過的最常見的問題 – gbn 2011-05-24 11:39:39

+6

-1另外。萬一你不確定這個問題,一個併發事務可能會執行一個插入操作,因此你的選擇返回錯誤的結果。 – 2011-05-24 11:56:15

10

您可以使用ExecuteScalar從Sqlcommand獲取最後一個值。

scope_identity()函數比@@ identity更安全。

2

我建議使用存儲過程來做到這一點。您可以給它一個OUTPUT參數,您可以使用該參數將id值返回給您的應用程序。

-3

僅對查詢使用Stored Procedure,並使用SCOPE_IDENTITY來獲取最大值。

+2

已經參數化。 'Parameters.AddWithValue'告訴我們這一點。 – gbn 2011-05-24 11:54:42

+0

寫入查詢併發送到網絡可能會產生擁塞。就像OP寫的「string query =」INSERT INTO SocialGroup(created_by_fbuid)VALUES(@FBUID); SELECT @@ IDENTITY AS LastID「; 」這不是一個好習慣。這應該在存儲過程 – Pankaj 2011-05-24 11:57:14

+1

你有權威的參考來描述那個行爲嗎?存儲的proc呼叫仍然通過網絡發送。 – gbn 2011-05-24 12:43:26

5

就我個人而言,我會重新編寫代碼來使用參數。您可以使用InputOutput參數或Output參數。但是,在SQL中使用返回值也是可行的。

關於此can be found on MSDN的完整示例。

我也會使用Scope_Identity()而不是@@Identity,這樣可以確保您會尊重與當前事務相關的ID。有關Scope_Identity can be found here的詳情。

26

OUTPUT子句?

string query = "INSERT INTO SocialGroup (created_by_fbuid) 
       OUTPUT INSERTED.IDCol --use real column here 
       VALUES (@FBUID)"; 
... 
int lastId = (int)command.ExecuteScalar(); 
+0

工程,但我得到2行插入,爲什麼? – Johan 2011-05-24 11:52:41

+0

@Johan:它在某處被調用兩次。給定的SQL僅插入一行。 – gbn 2011-05-24 11:55:49

+1

使用SCOPE_IDENTITY()而不是OUTPUT可能會更好,因爲如果在表上設置了觸發器(如[此問題鏈接]上所述),OUTPUT會給出錯誤(http://stackoverflow.com/questions/330707/如何插入記錄並返回新創建的ID使用單個sqlcommand)) – marquito 2012-07-31 12:23:28

8

如果您的服務器支持OUTPUT clause你可以用這一個嘗試:?如何獲得最後插入的ID]的

public static void CreateSocialGroup(string FBUID) 
{ 
    string query = "INSERT INTO SocialGroup (created_by_fbuid) OUTPUT INSERTED.IDENTITYCOL VALUES (@FBUID)"; 

    using (SqlConnection connection = new SqlConnection(ConnectionString)) 
    { 
     SqlCommand command = new SqlCommand(query, connection); 
     command.Parameters.AddWithValue("@FBUID", FBUID); 

     connection.Open(); 
     var _id = command.ExecuteScalar(); 
    } 
} 
+0

INSERTED.IDENTITYCOL在SQL Azure中不起作用。但是,如果您的身份列以「ID」命名,那麼INSERTED.ID可以工作! – 2012-07-07 01:58:17