2008-11-25 70 views
4

我目前在C#中工作,我需要將新記錄插入到一​​個表中,獲取新的主鍵值,然後將其用作外鍵引用以插入多個記錄。數據庫是MS SQL Server 2003.所有幫助表示讚賞!從MS SQL Server獲取自動編號主鍵

+0

你使用像LINQ的框架或您使用的SQL字符串查詢? (在我的回答中,我假設LINQ) – Yona 2008-11-25 00:34:12

回答

8

獲取插入行身份的方法是使用SCOPE_IDENTITY()函數。如果你正在使用存儲過程,那麼這將看起來像下面這樣將行標識作爲輸出參數返回。

CREATE PROCEDURE dbo.MyProcedure 
(
    @RowId INT = NULL OUTPUT 
) 
AS 

INSERT INTO MyTable 
(
    Column1 
    ,Column2 
    ,... 
) 
VALUES 
(
    @Param1 
    ,@Param2 
    ,... 
); 

SET @RowId = SCOPE_IDENTITY(); 

然後可以使用該值對於任何後續的插入物(可選地,如果可以通過所有數據到存儲過程,則可以在過程體的其餘部分使用它)。

如果你傳遞的SQL在動態然後使用幾乎相同的技術,但單一的字符串分隔符的語句(也;在SQL),例如:

var sql = "INSERT INTO MyTable (Column1, Column2, ...) VALUES (@P1, @P2, ...);" + 
      "SELECT SCOPE_IDENTITY();"; 

然後,如果你執行這個使用ExecuteScalar,您將能夠將標識返回爲標量結果並將其轉換爲正確的類型。或者,您可以一次構建整批產品,例如

var sql = "DECLARE @RowId INT;" + 
      "INSERT INTO MyTable (Column1, Column2, ...) VALUES (@P1, @P2, ...);" + 
      "SET @RowId = SCOPE_IDENTITY();" + 
      "INSERT INTO MyOtherTable (Column1, ...) VALUES (@P3, @P4, ...);"; 

這可能不是正好正確的語法,你可能需要在開始使用SET NOCOUNT ON;(我心裏很生疏,因爲我很少使用動態SQL),但它應該讓你在正確的軌道上。

+0

我更喜歡這種方法(使用OUT參數)而不是返回數據集。尤其適用於自動生成的代碼。 – 2008-11-25 00:32:35

4

這樣做的最好方法是在TSQL中使用SCOPE_IDENTITY()函數。這應該作爲插入的一部分來執行,即

SqlCommand cmd = new SqlCommand(@" 
    INSERT INTO T (Name) VALUES(@Name) 
    SELECT SCOPE_IDENTITY() As TheId", conn); 
cmd.AddParameter("@Name", SqlDbType.VarChar, 50).Value = "Test"; 
int tId = (int)cmd.ExecuteScalar(); 

或者,也可以分配SCOPE_IDENTITY()以在相繼的語句中使用的變量。例如

DECLARE @T1 int 

INSERT INTO T (Name) VALUES('Test') 

SELECT @T1 = SCOPE_IDENTITY() 

INSERT INTO T2 (Name, TId) VALUES('Test', @T1) 
+0

是所有這些字符串,還是作爲單獨的字符串傳入?你的解決方案沒有說清楚。請記住,我正在通過C#執行SQL查詢。 – Zeroth 2008-11-25 00:31:36

+0

在這兩種情況下,您都可以傳遞一個字符串。對於第一種方法,您可以使用SqlCommand ExecuteScaler()來獲取剛剛插入的行的標識。你也想使用command.AddParameter將硬編碼的'Test'綁定到@Name參數以避免sql注入。 – Duncan 2008-11-25 00:36:25

3

如果你只是使用SQL,然後檢查鄧肯的答案。但是,如果您使用的是LINQ,那麼您可以創建該實體,將其保存到數據庫,並且ID參數將自動填充。

給定用戶實體和用戶表,可能是這樣的:

using(var db = new DataContext()) { 
    var user = new User { Name = "Jhon" }; 
    db.Users.InsertOnSubmit(user); 
    db.SubmitChanges(); 
    /* At this point the user.ID field will have the primary key from the database */ 
}