2015-09-04 67 views
0

我創建了一個使用uniqueidentifier作爲主鍵的SQL Server表。我將默認值或綁定設置爲newid()。 (我想爲此列設置標識規範,但不支持uniqueidentifier類型。)當ID是唯一標識符時返回新行的ID

然後我使用ADO.NET向此表中添加一行。

SqlComment command = new SqlCommand("INSERT INTO [User] (Name) VALUES (@name); 
            SELECT SCOPE_IDENTITY()", Connection); 
command.Parameters.AddWithValue("@name", "Joe Smoe"); 
Guid userId = (Guid)command.ExecuteScalar(); 

然而,在最後一行失敗,因爲ExecuteScaler()回報null。看起來,由於uniqueidentifier不能是該表的標識,SCOPE_IDENTITY()返回null(與@@IDENTITY一樣)。

好的,那麼還有另一種方法來使用ADO.NET檢索新添加的ID嗎?

+0

這是因爲SCOPE_IDENTITY返回最後插入的IDENTITY值。你的表沒有標識,所以NULL是唯一可以返回的東西。 Guid已經變得如此流行的一個原因是因爲你可以在你的代碼中定義它並將它傳遞給sql server。我當然希望如果這是你的主鍵,它不是聚集索引。你也可以看看這篇文章。 http://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/ –

回答

5

SCOPE_IDENTITY()僅用於標識值,對於需要使用OUTPUT子句和表變量的guid值。

DECLARE @NewGuid TABLE(NewValue UNIQUEIDENTIFIER); 

INSERT INTO [User] (Name) 
OUTPUT inserted.pk_ColName INTO @NewGuid(NewValue) 
VALUES (@name); 

SELECT * FROM @NewGuid --<-- here you will have the new GUID Value 

C#代碼看起來是這樣的....

string cmd = "DECLARE @NewGuid TABLE(NewValue UNIQUEIDENTIFIER); 
       INSERT INTO [User] (Name) 
       OUTPUT inserted.pk_ColName INTO @NewGuid(NewValue) 
       VALUES (@name); 
       SELECT @newID = NewValue FROM @NewGuid;" 


SqlCommand command = new SqlCommand(cmd, Connection); 
cmd.Parameters.AddWithValue("@name", "Joe Smoe"); 
cmd.Parameters.Add("@newID", SqlDbType.UniqueIdentifier).Direction = ParameterDirection.Output; 
Guid userId = (Guid)cmd.ExecuteScalar(); 

個人而言,我會把整個事情中的存儲過程。

+0

如果您使用ExecuteScalar()if,則不必添加輸出參數if你只輸出一個值。 –

1

Scope_Identity()關注於IDENTITY字段,所以它永遠不會產生任何東西。您需要從INSERTED輸出。雖然這個頁面是不是專注於您的特定問題,應該給你一些線索:

Return ID on INSERT?

我的法線方向是一個存儲過程,但你可以鏈的命令,你做了。存儲過程使事情變得容易一些,因爲您可以爲過程創建輸出參數,但輸出值可以正常工作。

編輯,以顯示具體的例子:

假設如下表:

CREATE TABLE [dbo].[MyTable] 
(
    [Id] [uniqueidentifier] PRIMARY KEY NOT NULL DEFAULT NEWID(), 
    [Name] [varchar](50) NOT NULL, 
) 

下面的程序將輸出NEWID()創建的新GUID:

class Program 
{ 
    static void Main(string[] args) 
    { 

     var connString = ConfigurationManager.ConnectionStrings["testDB"].ToString(); 
     var cmdString = "INSERT INTO MyTable (Name) OUTPUT Inserted.Id VALUES ('Name')"; 

     var connection = new SqlConnection(connString); 
     var command = new SqlCommand(cmdString, connection); 

     Guid outputValue; 

     try 
     { 
      connection.Open(); 
      //Convert to Guid here instead 
      Console.WriteLine(command.ExecuteScalar().ToString()); 
     } 
     finally 
     { 
      connection.Dispose(); 
     } 

     Console.Read(); 

    } 
} 
+0

我瞭解OUTPUT參數,但是您鏈接的頁面上的建議與我現在遇到的問題相同。我仍然需要一種方法來獲取新ID以便將其分配給OUTPUT參數。 (存儲過程不是我正在做的最好的選擇。) –

+0

如果你看到答案,它確實回答了這個問題。編輯拉扯廢話,讓你可以看到我在說什麼。 –