从插入的记录中取回唯一标识符

Getting back a uniqueidentifier from an inserted record

我开发了一个 C# 应用程序,可以在 2 个数据库之间切换 - SQL-Server 和本地 SQL-Compact DB。

插入内容时,我想取回插入的 ID,即 uniqueidentifier

ExecuteScalar() 不适用于 uniqueidentifier。仅当使用 output inserted.id.

但是 SQL-Compact 不支持 output inserted.id

有没有办法在两个数据库中取回 uniqueidentifier

这是使用变量的方法。

declare @GUID uniqueidentifier = newid()

insert (YourColumns)
values(@GUID)

select convert(varchar(36), @GUID) as MyKey

最好的办法是将 @@IDENTITY 与 select 语句结合使用。

将此作为您的 SQL 命令传递:

  insert into myTable ( col1, col2, ...) values ( 'val1', 'val2', ...);SELECT @@IDENTITY;

这实际上是插入值,然后立即(在同一会话中)调用最近创建的身份,也就是您刚刚插入的身份。

然后在你的代码中: int iResult = (int)sqlCommand.ExecuteScalar()

刚刚意识到这是@Sean Langem 的答案的重复,我将其保留,因为它确实添加了更多可能对 OP 有用的细节。


这可能不是最优雅的解决方案(即在应用程序中生成 GUID),但我相信它应该可以解决您的问题。请注意,我只针对 SQL 服务器进行了测试,而不是 SQL Compact。

使用 ExecuteScalar() 来 return 您的 ID,但是在存储过程中将其转换为字符串 (varchar),然后在您的应用程序中转换回 GUID。

下面的例子是一个非常简单的例子,用于演示目的,代码在VB.Net中,并没有确保连接关闭,处理异常等

示例存储过程return将 UNIQUEIDENTIFER 值作为 VARCHAR:

CREATE PROCEDURE test
AS 

    DECLARE @id uniqueidentifier
    SET @id = NEWID()

    SELECT CONVERT(VARCHAR(38), @id)
GO

示例 .Net 代码调用数据库并检索字符串,然后转换为 guid。

Sub main()

    Dim id As Guid
    Dim stringId As String

    Using con As New SqlConnection("Server=<server>;Database=<DB>;Trusted_Connection=True;")
        Using cmd As New SqlCommand("test", con)
            cmd.CommandType = Data.CommandType.StoredProcedure

            con.Open()
            stringId = cmd.ExecuteScalar()
        End Using
    End Using

    id = New Guid(stringId)

End Sub

使用 SQL Server Compact 无法做到这一点。

如果必须使用 GUID,唯一的方法是在客户端创建 GUID,而不是向数据库引擎请求生成的值。