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 行で失敗しています。パラメータをuniqueidentifierに変更して実際の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

自分の質問に答えられなくて申し訳ありませんが、これで解決しました。カスタム メンバーシップ プロバイダーを取り除き、デフォルトの MembershipUser.UnlockUser(); を使用しました。そしてそれはうまくいきます。とにかく、カスタム プロバイダーは実際には何もしていませんでした。もう使われていない機能のために開発されたと思います。

于 2012-06-13T21:21:22.923 に答える