2012-06-13 61 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();它效果很好。定製提供者實際上並沒有做任何事情。我認爲它是爲不再使用的功能而開發的。

相關問題