2012-03-20 52 views
2

我有一個包含2列的簡單表 - 名稱和主鍵id。當我插入一個值時,我希望能夠直接在我的代碼中檢索值。獲取插入值的主鍵

所以我必須:

db.Execute("INSERT INTO table(name) VALUES (@0)",name); 

id列不自動填充和行存儲。

那麼我該如何才能db.Query();這個值的時候名稱不是唯一的呢?這可能嗎?

一個有趣的問題,我覺得:)

+0

您的id列設置爲AUTO_INCREMENT嗎? – hkf 2012-03-20 22:15:16

+0

的確,是的。 – 2012-03-20 22:16:18

+0

[如何插入記錄並使用單個SqlCommand返回新創建的ID?](http://stackoverflow.com/questions/330707/how-to-insert-a-record-and-return-the -newly-created-id-using-a-single-sqlcommand) – jrummell 2012-03-20 22:18:46

回答

7

您可以將部件添加到您的插入返回使用@@IDENTITY身份:

INSERT INTO table(name) VALUES (@0); SELECT @@IDENTITY; 

更新:由於自@@IDENTITY作品在評論中所指出全球範圍內,你應該實際使用SCOPE_IDENTITY()代替限制到當前範圍:

INSERT INTO table(name) VALUES (@0); SELECT SCOPE_IDENTITY(); 

然後您可以檢索通過用ExecuteScalar()執行插入操作並抓取結果來確定主鍵/身份。

+0

我同意,但是使用IDENTITY_SCOPE,因爲它更適合手頭的問題。 INSERT INTO表(名稱)VALUES(@ 0); SELECT @@ IDENTITY; – 2012-03-20 22:18:58

+0

@Roberto ...我認爲你的意思是SCOPE_IDENTITY():-) – 2012-03-20 22:20:47

+0

@RobertoHernandez:你是對的,那將是更好的方法,更新回答 – BrokenGlass 2012-03-20 22:24:10

1

使用db.ExecuteScalar並在您的SQL語句末尾添加SELECT SCOPE_IDENTITY()以檢索主鍵。

3

你會想要使用SCOPE_IDENTITY()禁止一些不尋常的情況。例如:

INSERT INTO table(name) VALUES (@0); SELECT Scope_Identity(); 

爲什麼不能@@身份?因爲在許多情況下它可能是錯誤的。 MSDN docs describe它爲:

@@ IDENTITY,SCOPE_IDENTITY和IDENT_CURRENT是 類似的功能,它們返回插入 表的標識列中的最後一個值。

@@ IDENTITY和SCOPE_IDENTITY將返回當前會話中任何表中生成的最後一個標識值 。但是,SCOPE_IDENTITY 僅在當前範圍內返回值; @@ IDENTITY不是 僅限於特定範圍。