实体框架 - 从数据库第一个存储过程返回GUID

时间:2017-04-25 22:49:18

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

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

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)

导致上述错误的原因是什么?

2 个答案:

答案 0 :(得分: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()将抛出异常,并且如果返回了多个结果。

答案 1 :(得分:0)

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

当您使用public Guid时,您正尝试将用户名(当然也不是带有四个破折号的32位十六进制数字)分配为GUID数据格式。

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

编辑:我错误地读取了原始条目,但上述内容不正确。但是,错误消息指示传递给Guid.Parse的值不是GUID的字符串表示形式。

那么,实际存储在Id字段中的值是多少?它是一个标识字段,一个实际的GUID(在这种情况下你不需要.Parse它),一个字符串,或者??