2017-04-25 52 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或一個標識字段? –

相關問題