2017-04-25 80 views
2

我有一个调用的数据库中存在的实体框架 - 从数据库中第一个存储过程返回GUID

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) 

什么导致上述错误?

回答

1

the docsSqlQuery返回一组结果。如果你只期待一个结果回你需要调用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

谢谢了。这解决了我的问题。从昨天打破我的头脑,找出真正的问题是什么。 – Yoda

0

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

您正试图给你当分配一个用户名,这是几乎可以肯定,也不具有四个破折号32位十六进制数,一个GUID数据格式使用public Guid

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


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

那么,在Id字段中实际存储了什么值?它是一个身份字段,一个实际的GUID(在这种情况下,你不需要打包它),一个字符串或?

+0

'username'被传递给SqlQuery中的一个参数 - 但是OP然后将SqlQuery传递给它,而不是将其中的单个元素传递给'TryParse'。 –

+0

你说得对,我误解了这个。但是,根据错误消息,'Id'字段被返回一个GUID或一个标识字段? –