我开发了一个可以在2个数据库之间切换的C#应用程序-SQL-Server和本地SQL-Compact DB。
插入某物时,我想找回插入的ID uniqueidentifier
。
ExecuteScalar()
不适用于uniqueidentifier
。仅在使用output inserted.id
时。
但是SQL-Compact不支持output inserted.id
。
是否有办法在两个数据库中取回uniqueidentifier
?
答案 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()