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

时间:2019-01-23 22:11:05

标签: c# sql sql-server sql-server-ce

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

插入某物时,我想找回插入的ID uniqueidentifier

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

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

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

4 个答案:

答案 0 :(得分:5)

这是使用变量的方法。

declare @GUID uniqueidentifier = newid()

insert (YourColumns)
values(@GUID)

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

答案 1 :(得分:1)

SQL Server Compact无法做到这一点。

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

答案 2 :(得分:0)

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


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

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

下面的示例是一个非常简单的示例,其代码位于VB.Net中,不能确保关闭连接,处理异常等。

样本存储过程返回UNIQUEIDENTIFER值作为VARCHAR:

CREATE PROCEDURE test
AS 

    DECLARE @id uniqueidentifier
    SET @id = NEWID()

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

示例.Net代码以调用数据库并检索String,然后转换为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

答案 3 :(得分:-3)

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

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

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

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

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