1

我的项目中有这段代码:

string userId = Membership.GetUser(username).ProviderUserKey.ToString();
SqlConnection conn = new SqlConnection(connectionString);
SqlCommand cmd = new SqlCommand("UPDATE aspnet_Membership SET IsLockedOut = 0, LastLockoutDate = @LastLockedOutDate WHERE UserId = @Userid", conn);
cmd.Parameters.Add("@LastLockedOutDate", SqlDbType.DateTime).Value = DateTime.Now;
cmd.Parameters.Add("@Userid", SqlDbType.VarChar, 255).Value = userId;
int rowsAffected = 0;
conn.Open();
rowsAffected = cmd.ExecuteNonQuery();

这在我的本地机器上非常有效。用户解锁没问题。但是由于某种原因,当我将它部署到远程服务器上的演示站点时,我收到了这个错误:

InvalidCastException: Failed to convert parameter value from a Guid to a String

它在 cmd.ExecuteNonQuery 行上失败。我尝试将参数更改为唯一标识符并传递实际的 guid,但这也不起作用。

有人知道为什么这会在本地工作,但不能在远程服务器上工作吗?或者知道我可以修改代码以使其可能工作的方法吗?

4

3 回答 3

3

而不是尝试手动解锁用户,您不能使用:-

 var oUser = Membership.GetUser(username);
 oUser.UnlockUser();
 Membership.UpdateUser(oUser);

这允许 .NET 进程为您完成所有繁重的工作。

[编辑以回答原始问题]

        Guid gUserID = (Guid)Membership.GetUser(username).ProviderUserKey;
        if (gUserID != Guid.Empty)
        {
            using (
                var oConn =
                    new SqlConnection(connectionString)
            {
                oConn.Open();
                using (SqlCommand oCmd = oConn.CreateCommand())
                {
                    oCmd.CommandType = CommandType.Text;
                    oCmd.CommandText = "UPDATE aspnet_Membership SET IsLockedOut = 0, LastLockoutDate = @LastLockedOutDate WHERE UserId = @gUserID";
                    oCmd.Parameters.Add(new SqlParameter("@gUserID", gUserID));
                    oCmd.Parameters.Add(new SqlParameter("@LastLockedOutDate", DateTime.UtcNow));
                    oCmd.ExecuteNonQuery();
                }
            }
        }

将您的 DateTime.Now 更改为 DateTime.UtcNow 也可能是值得的,这样如果您不得不移动时区或与其他机器共享您所在的位置,那么您都处于等价时间。

如果您在 ProviderUserKey 上引发错误,则可能是用户不存在或 UserID 毕竟不是 GUID。

于 2012-06-13T18:49:08.017 回答
1

也许你可以尝试类似

cmd.Parameters.Add("@Userid", SqlDbType.Guid).Value = new Guid(userId);

于 2012-06-13T18:50:31.980 回答
0

很抱歉跛脚回答我自己的问题,但我解决了这个问题。我剥离了自定义成员资格提供程序,只使用了默认的 membersUser.UnlockUser(); 而且效果很好。自定义提供程序实际上并没有做任何事情。我认为它是为不再使用的功能而开发的。

于 2012-06-13T21:21:22.923 回答