我的项目中有这个代码:
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行上失败了。我尝试将参数更改为uniqueidentifier并传递实际的guid,但这也不起作用。
有人知道为什么这会在本地运行但不在远程服务器上运行?或者知道我可以修改代码以便可能工作的方法吗?
答案 0 :(得分: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。
答案 1 :(得分:1)
也许你可以试试像
这样的东西 cmd.Parameters.Add("@Userid", SqlDbType.Guid).Value = new Guid(userId);
答案 2 :(得分:0)
抱歉蹩脚的回答了我自己的问题,但我解决了这个问题。我剥离了自定义成员资格提供程序,只使用了默认的membershipUsser.UnlockUser();它很棒。自定义提供程序实际上并没有做任何事情。我认为它是为不再使用的功能而开发的。