从插入的记录中取回唯一标识符
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,而不是向数据库引擎请求生成的值。
我开发了一个 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,而不是向数据库引擎请求生成的值。