Sur mon CreateUserWizard, j'invoquer des propriétés supplémentaires et quand je l'appelle GetUser(), je reçois:
« Il existe déjà un DataReader ouverte associée à cette commande qui doit d'abord être fermé »
Le codebehind de Registration.aspx:La bonne façon d'appeler les méthodes MembershipProvider?
NCCMembershipUser currentUser = (NCCMembershipUser)Membership.GetUser();
Guid id = (Guid)currentUser.ProviderUserKey;
...assigning control values to membership values...
try
{
NCCMembershipProvider u = (NCCMembershipProvider)Membership.Provider;
u.UpdateUser(currentUser);
}
Est-ce que je ne devrais pas utiliser GetUser pour accéder aux propriétés?
est ici la méthode GetUser:
public override MembershipUser GetUser(string username, bool userIsOnline)
{
SqlConnection conn = new SqlConnection(connectionString);
SqlCommand cmd = new SqlCommand("SELECT UserID," +
" Email," +
" Comment," +
" PasswordQuestion," +
" IsApproved," +
" LastActivityDate," +
" LastLoginDate," +
" LastPasswordChangedDate," +
" CreationDate," +
" IsLockedOut," +
" LastLockedOutDate," +
" UserSalutation," +
" UserFirstName," +
" UserLastName," +
" UserPosition," +
" UserCompany," +
" UserCompanyType," +
" UserCompanyTypeOther," +
" UserAccountType," +
" UserAddress1," +
" UserAddress2," +
" UserCity," +
" UserStateProv," +
" UserPostal," +
" UserCountry," +
" UserWebsite," +
" UserPhone," +
" UserPhoneExt," +
" UserFax," +
" UserIP," +
" UserIPLastLogin," +
" IsSubscribed," +
" LikeAreaRugs," +
" LikeCarpeting," +
" LikeCoverings," +
" LikeComponents," +
" LikeHotel," +
" LikeAccessories" +
" FROM Users WHERE Email = @Email AND ApplicationName = @ApplicationName", conn);
cmd.Parameters.Add("@Email", SqlDbType.NVarChar, 128).Value = username;
cmd.Parameters.Add("@ApplicationName", SqlDbType.NVarChar, 255).Value = m_ApplicationName;
NCCMembershipUser u = null;
SqlDataReader reader = null;
try
{
conn.Open();
reader = cmd.ExecuteReader();
if (reader.HasRows)
{
reader.Read();
u = GetUserFromReader(reader);
if (userIsOnline)
{
SqlCommand updateCmd = new SqlCommand("UPDATE Users " +
"SET LastActivityDate = @LastActivityDate " +
"WHERE Email = @Email AND ApplicationName = @ApplicationName", conn);
updateCmd.Parameters.Add("@LastActivityDate", SqlDbType.DateTime).Value = DateTime.Now;
updateCmd.Parameters.Add("@Email", SqlDbType.VarChar, 255).Value = username;
updateCmd.Parameters.Add("@ApplicationName", SqlDbType.VarChar, 255).Value = m_ApplicationName;
updateCmd.ExecuteNonQuery();//<<------Error:"There is already an open DataReader associated with this Command which must be closed first."
}
}
}
catch (SqlException e)
{
if (WriteExceptionsToEventLog)
{
WriteToEventLog(e, "GetUser(String, Boolean)");
throw new ProviderException(exceptionMessage);
}
else
{
throw e;
}
}
finally
{
if (reader != null) { reader.Close(); }
conn.Close();
}
return u;
}
Il n'y a aucune raison pour laquelle vous ne pouvez pas appeler les membres de l'adhésion à volonté. Cela me semble être un bug avec ce que 'NCCMembershipProvider' est. – HackedByChinese
J'ai un fournisseur d'appartenances personnalisées distinct, mais le code est directement hors de MSDN. Je vais publier la méthode GetUser maintenant. – RyanJMcGowan