远程服务器上的无效转换异常Guid为字符串

时间:2012-06-13 18:44:43

标签: asp.net

我的项目中有这个代码:

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,但这也不起作用。

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

3 个答案:

答案 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();它很棒。自定义提供程序实际上并没有做任何事情。我认为它是为不再使用的功能而开发的。