2013-01-03 199 views
1

我試圖找回CURENT用戶成員資格提供UserId但事情不走我計劃的方式獲取用戶ID to.Here是我的代碼:從成員資格提供

cmd.Connection = conn; 
cmd.CommandType = CommandType.StoredProcedure; 
cmd.CommandText = "forum_GetUsernameId"; 
cmd.Parameters.Add("@username" , user); 
var data = cmd.ExecuteScalar(); 

@username nvarchar 
    AS 
SELECT UserId 
FROM aspnet_Users 
WHERE UserName = @username 

在調試我注意到,數據返回null女巫不能是posible,除非ExecuteScalar()不是我應該打電話的方法。 另外,用戶被設置爲我確定的用戶名。

我在這裏做錯了什麼?

+0

溝MembershipProviders爲時已晚之前!它們是無用的 –

回答

2

如果您使用SqlMemberShipProvider反正很簡單:

Guid userID = (Guid) Membership.GetUser().ProviderUserKey; 
1

您正在使用您的代碼SqlCommand.Parameter.Add()方法。如果您使用兩個參數使用Add()方法,您有兩個選擇;

Add(string, SqlDbType); 
Add(string, object); 

enter image description here

在這種情況下,我認爲你是想先用一個Add()。所以,當我查看數據庫時,UserId是一個uniquidentifier

enter image description here

正因爲如此,你應該改變你的代碼;

cmd.Parameters.Add("@username", SqlDbType.UniqueIdentifier); 

在代碼中使用ExecuteScalar()沒有任何錯誤。它返回查詢中第一列的第一行。所以,你的查詢只返回一列一列,沒有問題。但是,ExecuteScalar()會返回一個對象,也許您可​​能需要將其轉換爲帶有.ToString()的字符串。

0

如果您使用SqlMembershipProvider,請執行Tim所說的話。

否則,我不應該使用ExecuteScalar()來讀取一個字段/列數據認爲,可以嘗試使用ExecuteReader

var data = cmd.ExecuteReader(); 
while(reader.Read()) 
{ 
//code goes here 
} 
+0

否。在這種情況下,ExecuteScalar沒問題,因爲他的查詢只返回一列一列。 ExecuteScalar沒有錯。 –

相關問題