2012-06-13 117 views
1

我有这样的代码在我的项目:无效转换异常GUID字符串

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

而不是试图手动解锁,用户可以不要使用: -

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。

+0

其实我不行。之前的人创建了一个自定义会员提供商,因为他们决定向aspnet_membership添加几个列。此代码位于自定义提供程序中。 – William

+0

查看已更新回答 –

+0

与我的实施有何不同?我会不会仍然遇到转换错误? – William

1

也许你可以尝试这样

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

+0

这没有奏效。 – William

0

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

相关问题