代码之家  ›  专栏  ›  技术社区  ›  juergen d

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

  •  0
  • juergen d  · 技术社区  · 6 年前

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

    当插入某些内容时,我想返回插入的ID,即 uniqueidentifier .

    ExecuteScalar() 不适用于 唯一标识符 . 仅当使用时 output inserted.id .

    但是 插入输出.id SQL Compact不支持。

    有没有办法回来 唯一标识符 在两个数据库中?

    4 回复  |  直到 6 年前
        1
  •  1
  •   ErikEJ    6 年前

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

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

        2
  •  5
  •   Sean Lange    6 年前

    下面是如何使用变量来完成这项工作。

    declare @GUID uniqueidentifier = newid()
    
    insert (YourColumns)
    values(@GUID)
    
    select convert(varchar(36), @GUID) as MyKey
    
        3
  •  0
  •   Mathew Paxinos    6 年前

    我刚刚意识到这是@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代码调用数据库并检索字符串,然后转换为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
    
        4
  •  -3
  •   IanCaz    6 年前

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

    将此作为SQL命令传递:

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

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

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