【问题标题】:Scope_Identity not working with GUID on c#Scope_Identity 不适用于 c# 上的 GUID
【发布时间】:2015-07-13 10:36:55
【问题描述】:

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

标识符类型是 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" 上收到以下错误。

有什么有用的建议吗?

【问题讨论】:

  • 如果您只想将唯一标识符传递给数据库,您是否尝试过:stackoverflow.com/questions/11724614/…
  • 我要获取插入行的唯一标识。
  • 附加:“;SELECT SCOPE_IDENTITY();”结束在线查询并调用 ExecuteScalar(...) 可能会为您解决问题。另外,请看一下:stackoverflow.com/questions/3913115/…
  • 您的身份列是否在Comment 类型为uniqueidentifier 的表中?
  • 我已经在最后尝试了带有 select 范围的 executescalar,但它也没有工作。是的,我的列标识类型 os uniqueidentifier。

标签: c# database insert scope guid


【解决方案1】:

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 及更高版本中运行

【讨论】:

  • 或更简单的版本:var sql = "insert into yourTable(col2,col3) output inserted.guidCol values('test','best')"; var guid = (Guid) cmd.ExecuteScalar();
【解决方案2】:

我尝试使用 SCOPE_IDENTITY() 来检索 Guid 值,但没有与我合作。您可以尝试声明一个 SQL 变量并使用命令 NEWID() 生成一个新的 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;

【讨论】:

    猜你喜欢
    • 2010-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多