我一直在尝试在数据库中插入一些数据,同时获取标识符。
标识符类型是Guid。
我已经尝试了一些决议。
我正在搜索,但我找不到任何与C#中的Guid一起使用的方法。
我尝试的最后一个是这样的:
dbAccess db = new dbAccess();
SqlConnection con = db.openConnection();
Guid retVal = Guid.Empty;
try
{
SqlCommand cmd = new SqlCommand(@"insert into Comment(IdDiscussion,UserId,Description,DateTime)
values(@IdDiscussion,@UserId,@description,@dateTime);
set @ret=SCOPE_IDENTITY();", con);
cmd.Parameters.AddWithValue("@IdDiscussion", discussionId);
cmd.Parameters.AddWithValue("@UserId", userId);
cmd.Parameters.AddWithValue("@description", comment);
cmd.Parameters.AddWithValue("@dateTime", dateTime);
SqlParameter retParameter = new SqlParameter("@ret", SqlDbType.UniqueIdentifier);
retParameter.Direction = ParameterDirection.Output;
cmd.Parameters.Add(retParameter);
cmd.ExecuteNonQuery();
retVal = (Guid)retParameter.Value;
}
catch (Exception e)
{
//doesn't really matter
}
db.closeConnection();
return retVal;
在这种情况下,我在executeNonQuery(): "Operand type clash: numeric is incompatible with uniqueidentifier"
上收到以下错误。
任何可以提供帮助的建议?
答案 0 :(得分:3)
scope_identity()仅返回最后一个(作用域)标识值 - 此值数据类型必须为数字。
所以不幸的是,我想到的唯一解决办法就是这样:
declare @op table
(
ColGuid uniqueidentifier
)
insert into Comment(IdDiscussion,UserId,Description,DateTime)
output inserted.CommentId -- GUID column
into @op
values (@IdDiscussion,@UserId,@description,@dateTime)
select top 1 o.ColGuid
from @op o
然后在你的代码中:
var guid = (Guid)cmd.ExecuteScalar();
再提一点:此解决方案应该适用于SQL Server 2005及更高版本
答案 1 :(得分:1)
我尝试使用SCOPE_IDENTITY()来检索Guid值,但没有使用我。您可以尝试使用命令NEWID()声明一个SQL变量并生成一个新的guid,最后在该变量中执行一个SELECT命令,在命令对象上执行ExecuteScalar方法。
DECLARE @Id UNIQUEIDENTIFIER; SET @Id = NEWID();
INSERT INTO [tablename] ([Id], [Field1], [Field2]) VALUES (@Id, @Field1, @Field2);
您必须正常在命令上添加参数。
cmd.Parameters.AddWithValue("@Field1", "Field 1 Value");
cmd.Parameters.AddWithValue("@Field2", "Field 2 Value"));
所以,执行并检索值。
var obj = cmd.ExecuteScalar();
Guid guid = (Guid)obj;