从成员资格提供程序中检索UserId

时间:2013-01-03 14:54:11

标签: c# asp.net ado.net asp.net-membership membership

我正在尝试从成员资格提供程序中检索当前用户UserId,但有些事情并没有按照我的计划进行。这是我的代码:

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,除非ExecuteScalar()不是我应该调用的方法,否则这个数据是不可能的。 用户也被设置为我确定的用户名。

我在这里做错了什么?

3 个答案:

答案 0 :(得分:2)

如果你正在使用SqlMemberShipProvider,那很简单:

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

答案 1 :(得分:1)

您在代码中使用SqlCommand.Parameter.Add()方法。如果您使用带有两个参数的Add()方法,则有两个选择;

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

enter image description here

在这种情况下,我认为您尝试使用第一个Add()。因此,当我查看数据库时,UserIduniquidentifier

enter image description here

因此,您应该将代码更改为;

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

在代码中使用ExecuteScalar()没有错。它返回查询第一列的第一行。因此,您的查询只返回一行一行,没有问题。但是,ExecuteScalar()会返回一个对象,也许您可​​能需要使用.ToString()转换为字符串。

答案 2 :(得分:0)

如果你正在使用SqlMembershipProvider,请按照Tim所说的那样做。

否则,我认为您不应该使用ExecuteScalar()来读取字段/列中的数据,请尝试使用ExecuteReader

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