Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [C#] Datareadergià aperto

    codice:
                    while (reader.Read())
                    {
                        if (System.Convert.ToInt32(reader[0]) > 0)
                        {
                            //Prendiamo la quantità venduta, per sottrarla a quella che abbiamo in magazzino
                            string queryVendita = "SELECT sum(prodotti_venduti.quantita) AS venduti FROM prodotti_venduti WHERE codice = '" + reader[2].ToString() + "' AND prodotti_venduti.conta='1' GROUP BY prodotti_venduti.codice";
                            
                            SqlCommand oleCmdQuant = new SqlCommand(queryVendita, conn);
    
                            long venduti = System.Convert.ToInt64(oleCmdQuant.ExecuteScalar());
    
                            DataRow dr = ds.Tables["Merce"].NewRow();
                            dr["Codice"] = reader["artCod"].ToString();
                            dr["BarCodice"] = reader["artBar"].ToString();
                            dr["Descrizione"] = reader["artDesc"].ToString();
                            dr["Quantita"] = (System.Convert.ToInt64(reader[0]) - venduti).ToString();
                            if ((System.Convert.ToInt64(reader[0]) - venduti) > 0)
                                ds.Tables["Merce"].Rows.Add(dr);
                        }
                    }
    Perchè quando eseguo questo codice ho il seguente errore:

    Al comando è già associato un DataReader aperto, che deve essere chiuso.
    long venduti = System.Convert.ToInt64(oleCmdQuant.ExecuteScalar() ); <----- L'errore sta qua

    Se chiudo il reader con close allora non da errore, ma reader mi serve per altre cose e non ha nessuna relazione con oleCmdQuant, non riesco a capire...

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,466

    Re: [C#] Datareadergià aperto

    Originariamente inviato da SkOrPiOn`87
    Se chiudo il reader con close allora non da errore, ma reader mi serve per altre cose
    Per poter eseguire un nuovo comando sulla stessa connessione, è necessario chiudere l'oggetto DataReader.

    Se usi lo stesso DataReader per query consecutive, chiudilo prima di eseguire un nuovo comando. L'esecuzione del comando la fai richiamando ExecuteReader, quindi di fatto crei comunque un nuovo oggetto DataReader.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Il problema è che stavo utilizzando un dataread diverso, o almeno credo

    Ho risolto creando una nuova conn essione al database, però adesos ho 2 connesisoni aperte al database, non è che mi piaccia molto....

    codice:
                    oleCmd = new SqlCommand(query, conn);
    
                    reader = oleCmd.ExecuteReader();
    
                    using (SqlConnection conn2 = new SqlConnection(MainForm.Database()))
                    {
                        conn2.Open(); 
                        while (reader.Read())
                        {
                            if (System.Convert.ToInt32(reader[0]) > 0)
                            {
                                //Prendiamo la quantità venduta, per sottrarla a quella che abbiamo in magazzino
                                string queryVendita = "SELECT sum(prodotti_venduti.quantita) AS venduti FROM prodotti_venduti WHERE codice = '" + reader[2].ToString() + "' AND prodotti_venduti.conta='1' GROUP BY prodotti_venduti.codice";
    
                                SqlCommand oleCmdQuant = new SqlCommand(queryVendita, conn2);
    
                                long venduti = System.Convert.ToInt64(oleCmdQuant.ExecuteScalar());
    
                                DataRow dr = ds.Tables["Merce"].NewRow();
                                dr["Codice"] = reader["artCod"].ToString();
                                dr["BarCodice"] = reader["artBar"].ToString();
                                dr["Descrizione"] = reader["artDesc"].ToString();
                                dr["Quantita"] = (System.Convert.ToInt64(reader[0]) - venduti).ToString();
                                if ((System.Convert.ToInt64(reader[0]) - venduti) > 0)
                                    ds.Tables["Merce"].Rows.Add(dr);
                            }
                        }
                        conn2.Close();
                    }
                    conn.Close();
    Questo è il codice che sto utilizzando adesso...

  4. #4
    ma il reader lo devi tenere aperto?
    Come mai?

  5. #5
    perchè mi serve, per le query successive...

  6. #6
    allora puoi chiudere il reader e fare la query successiva, no?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.