我正在尝试从成员资格提供程序中检索当前用户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()
不是我应该调用的方法,否则这个数据是不可能的。
用户也被设置为我确定的用户名。
我在这里做错了什么?
答案 0 :(得分:2)
如果你正在使用SqlMemberShipProvider
,那很简单:
Guid userID = (Guid) Membership.GetUser().ProviderUserKey;
答案 1 :(得分:1)
您在代码中使用SqlCommand.Parameter.Add()
方法。如果您使用带有两个参数的Add()
方法,则有两个选择;
Add(string, SqlDbType);
Add(string, object);
在这种情况下,我认为您尝试使用第一个Add()
。因此,当我查看数据库时,UserId
是uniquidentifier
。
因此,您应该将代码更改为;
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
}