【问题标题】:Retrieving UserId from Membership Provider从成员资格提供者检索 UserId
【发布时间】:2013-01-03 14:54:11
【问题描述】:

我正在尝试从会员提供商那里检索当前用户 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() 不是我应该调用的方法。 用户也被设置为我确定的当前用户名。

我在这里做错了什么?

【问题讨论】:

  • 在为时已晚之前抛弃 MembershipProviders!他们没用

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


【解决方案1】:

如果您使用的是SqlMemberShipProvider,这很简单:

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 没有。在这种情况下,ExecuteScalar 很好,因为他的查询只返回一列一行。 ExecuteScalar 没有任何问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-04
      • 2013-11-04
      • 1970-01-01
      • 1970-01-01
      • 2012-07-09
      相关资源
      最近更新 更多