2017-04-25 11 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(Globally Unique Identifier)は、SQL Server、Entity Framework、およびその他のソースの特定のデータ型です。 B98332DB-F5E0-4022-860F-9A42A7DEB965

ほとんどの場合、4桁のダッシュの32桁の16進数のユーザー名をGUIDデータ形式に割り当てようとしていますが、 public Guidを使用してください。

procのデータ型をGuidからStringまたはその他のより正確なデータ型に変更します。


編集:私は間違って元のエントリを読み取り、上記は正しくありません。ただし、Guid.Parseに渡される値がGUIDの文字列表現ではないことを示すエラーメッセージが表示されます。

実際、Idフィールドにはどのような値が格納されていますか? IDフィールド、実際のGUID(その場合は.Parseする必要はありません)、文字列、または??

+0

'username'がSqlQueryのパラメータに渡されていますが、OPは' TryParse'に単一の要素ではなくSqlQueryを渡しています。 –

+0

あなたは正しいですが、私はこれを誤解しています。しかし、エラーメッセージに基づいて、 'Id'フィールドはGUIDまたはIdentityフィールドに返されますか? –

関連する問題