c#中的Scope_Identity与GUID不兼容



我一直在尝试在数据库中插入一些数据,同时获得标识符。

标识符类型为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"上得到以下错误:

有什么建议吗?

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及以上版本

我尝试使用SCOPE_IDENTITY()来检索Guid值,但没有与我一起工作。您可以尝试声明一个SQL变量,并使用命令NEWID()生成一个新的guid,最后在该变量中执行命令对象上的ExecuteScalar方法执行SELECT命令。

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;

相关内容

  • 没有找到相关文章

最新更新