【问题标题】:Entity framework - Return GUID from database first stored procedure实体框架 - 从数据库第一个存储过程返回 GUID
【发布时间】:2017-04-25 22:49:17
【问题描述】:

我有一个方法可以调用数据库中存在的存储过程

public Guid GetUserID(string userName)
{
  using (var entities = new entities ())
  {
    return  Guid.Parse(entities.Database.SqlQuery<Guid>(
                       "dbo.[GetUserID] @UserName",
                       new Object[] { new SqlParameter("@UserName",
                                                        userName)
                                                  }).ToString());
  }
}

还有我的存储过程:

CREATE PROCEDURE [dbo].[GetUserID] 
 @UserName NVARCHAR(100)
 AS
 BEGIN 
 SET NOCOUNT ON;

 SELECT TOP 1 ID FROM [DBO].[USER] WHERE USERNAME = @UserName
        ORDER BY CREATEDON DESC
END
GO

我添加了一些日志并收到以下错误:

Guid should contain 32 digits with 4 dashes (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).
   at System.Guid.TryParseGuidWithNoStyle(String guidString, GuidResult& result)
   at System.Guid.TryParseGuid(String g, GuidStyles flags, GuidResult& result)
   at System.Guid.Parse(String input)

是什么导致了上述错误?

【问题讨论】:

    标签: c# sql-server entity-framework stored-procedures


    【解决方案1】:

    the docs SqlQuery 返回结果集合。如果您只期望返回一个结果,则需要致电 SingleFirst

    var userIdQuery = entities.Database.SqlQuery<Guid>(
                       "dbo.[GetUserID] @UserName",
                       new Object[] { new SqlParameter("@UserName", userName)});
    
    // userIdQuery is a collection of Guids.
    // We need to take either the first one, or ensure there
    // is only one:    
    Guid.Parse(userIdQuery.Single().ToString());
    

    请注意,Single() 将在没有返回结果以及返回多个结果时抛出异常。

    【讨论】:

    • 非常感谢。这解决了我的问题。从昨天开始我的头,找出真正的问题是什么。
    【解决方案2】:

    GUID(全局唯一标识符)是 SQL Server、实体框架和其他来源中的特定数据类型。它表示为带有 4 个破折号的 32 位十六进制数字,如下所示:B98332DB-F5E0-4022-860F-9A42A7DEB965

    当您使用public Guid 时,您正在尝试将用户名(几乎可以肯定也不是带有四个短划线的 32 位十六进制数字)分配给 GUID 数据格式。

    将 proc 的数据类型从 Guid 更改为 String 或其他更正确的数据类型。


    编辑:我看错了原来的条目,上面是不正确的。但是,错误消息表明传递给 Guid.Parse 的值不是 GUID 的字符串表示形式。

    那么,Id 字段中实际存储的值是什么?它是一个身份字段、一个实际的 GUID(在这种情况下您不需要 .Parse 它)、一个字符串还是 ??

    【讨论】:

    • username 被传递到 SqlQuery 上的参数中 - 但是 OP 然后将 SqlQuery 传递给 TryParse,而不是其中的单个元素。
    • 你说得对,我看错了。但是,根据错误消息,返回的 Id 字段是 GUID 还是 Identity 字段?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-07
    • 1970-01-01
    • 1970-01-01
    • 2017-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多