1

我正在尝试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()不是我应该调用的方法。用户也被设置为我确定的当前用户名。

我在这里做错了什么?

4

3 回答 3

2

如果你仍然使用SqlMemberShipProvider它很简单:

Guid userID = (Guid) Membership.GetUser().ProviderUserKey; 
于 2013-01-03T14:55:36.727 回答
1

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

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

在此处输入图像描述

在这种情况下,我认为您尝试使用第Add()一个。所以,当我查看数据库时,UserId是一个uniquidentifier.

在此处输入图像描述

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

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

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

于 2013-01-03T15:23:58.943 回答
0

如果您正在使用SqlMembershipProvider,请按照蒂姆所说的做。

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

var data = cmd.ExecuteReader();
while(reader.Read())
{
 //code goes here
}
于 2013-01-03T15:24:39.870 回答