Convertiți MembruProvider de la OBDC la SQL aruncarea excepție

Obțineți o excepție aruncată la reader = cmd.ExecuteReader (); când debug.

CS0266: nu se poate converti implicit tipul "System.IAsyncResult" la "System.Data.SqlClient.SqlDataReader".

Acesta este un UserhipProvider personalizat derivat din furnizorul de eșantionare MSDN (http://msdn.microsoft.com/en-us/library/6tc47t75.aspx) cu valoarea de nume de utilizator care apelează câmpul bază de date pentru e-mail, mai degrabă decât o intrare separată de utilizator și conexiunea a fost modificată de la o conexiune ODBC la o conexiune SQL.

    public override MembershipUser GetUser(string username, bool userIsOnline)
    {
        SqlConnection conn = new SqlConnection(connectionString);
        SqlCommand cmd = new SqlCommand("SELECT UserID, Email, PasswordQuestion," +
            " Comment, IsApproved, IsLockedOut, CreationDate, LastLoginDate," +
            " LastActivityDate, LastPasswordChangedDate, LastLockedOutDate" +
            " FROM Users WHERE Email = ? AND ApplicationName = ?", conn);

        cmd.Parameters.Add("@Email", SqlDbType.NVarChar, 128).Value = username;
        cmd.Parameters.Add("@ApplicationName", SqlDbType.NVarChar, 255).Value = m_ApplicationName;

        MembershipUser 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 = ? " +
                        "WHERE Email = ? AND 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();
                }
            }

        }
0

2 răspunsuri

ați încercat să specificați numele parametrului în interiorul lui sqlcommand? semnul întrebării mi se pare ciudat

SqlCommand cmd = new SqlCommand("SELECT UserID, Email, PasswordQuestion," +
    " Comment, IsApproved, IsLockedOut, CreationDate, LastLoginDate," +
    " LastActivityDate, LastPasswordChangedDate, LastLockedOutDate" +
    " FROM Users WHERE Email = @email AND ApplicationName = @applicationname", conn);
1
adăugat
Acest lucru a împiedicat excepția. Cu toate acestea, a revenit "Contul dvs. nu a fost creat. Încearcă din nou." pe controlul ErrorMessage Literal în CreateUserWiard. Poate că a rezolvat-o. Va trebui să o iau și să văd unde se oprește.
adăugat autor RyanJMcGowan, sursa
Ai avut motive bune să nu-ți placă? Nu sunt acceptate cu Sql.
adăugat autor RyanJMcGowan, sursa
Încă mai lucrăm în diferite mișcări, dar în afara subiectului acestui fir. Mulțumiri.
adăugat autor RyanJMcGowan, sursa
așa că e pe drumul cel bun, trebuie să faci niște investigații suplimentare, mult noroc
adăugat autor uowzd01, sursa
Da, am văzut doar @param în sqlcommand, nu? S. Cum este depanarea dvs. cu noua eroare?
adăugat autor uowzd01, sursa

Ați încercat să utilizați un editor de date în locul unui cititor? Nu închideți cititorul în mod corespunzător oricum, ceea ce poate provoca probleme de memorie pe site-ul dvs. Web. Sincer, aproape că am întotdeauna probleme cu cititorii, cu excepția cazurilor foarte specifice.

0
adăugat
Cum nu o închid în mod corespunzător? Poate asta e problema.
adăugat autor RyanJMcGowan, sursa
S-a găsit acest lucru pe MSDN: Furnizorul de date Microsoft .NET Framework pentru SQL Server nu acceptă substituentul de semnătură de întrebare (?) Pentru transmiterea parametrilor într-o declarație SQL link
adăugat autor RyanJMcGowan, sursa
Cea mai ușoară cale de a închide este utilizarea "utilizării". folosind (SqlDataReader reader = cmd.ExecuteReader ()) {... codul dvs. ...}
adăugat autor Phil, sursa
în plus, atât sqlconnection, cât și sqlcommand nu au declarații apropiate sau dispuse pe ele. Puteți folosi și "utilizarea" pe ele. sau încercați/în cele din urmă blocați dacă preferați
adăugat autor Phil, sursa