56 messaggi dal 01 marzo 2002
Ciao a tutti ho un problema con il seguente codice:
 
      using (SqlConnection conn = new SqlConnection(HelperDB.LeggiLaStringaDiConnessione()))
        {
        using (SqlCommand cmd = new SqlCommand("spLeggiRichieste", conn))
          {
          cmd.CommandType = CommandType.StoredProcedure;

          cmd.Parameters.AddWithValue("@CodiciProduttore", codiciProduttore);
          cmd.Parameters.AddWithValue("@IdAmbiente", idAmbiente);

          conn.Open();

          using (SqlDataReader reader = cmd.ExecuteReader())
            {
            if (reader.HasRows)
              {
              richiestaColl = new List<RichiestaGpp>();

              while (reader.Read())
                richiestaColl.Add(PopolaRichiesta(reader));
              }

            reader.Close();
            }
          }
        conn.Close();
        }

 


Il problema è questo:
nel momento in cui viene valorizzata la variabile reader, questa contiene, correttamente, un record ma, subito dopo, viene vista come empty.
La proprietà reader.HasRows restituisce true e quindi il codice che sfrutta i dati del datareader va in errore.
Procedendo in debug ho notato che, andando a verificare la valorizzazione del datareader passandoci sopra il mouse ed espandendo le varie voci fino ad ottenere i valori in esso contenuti, la prima volta che ci passo sopra è tutto come mi aspetto, ma semplicemente spostando il mouse e ritornandoci sopra per ripetere la visualizzazione, il datareader risulta empty

Grazie per l'aiuto
Non ho ben capito il tuo problema.
Il ciclo del Reader è corretto? Ti ritorna il numero di record esatti? La funziona PopolaRichiesta cosa fa?

Fammi sapere.
Ciauz

P.S.: per la connection ed il reader non ti serve invocare il close dato che hai messo il tutto in dei blocchi using che, al termine del blocco, penseranno loro ad invocare il dispose degli oggetti.

imperugo
Microsoft MVP
myblog : http://www.tostring.it
massimo.narducci wrote:
ma semplicemente
spostando il mouse e ritornandoci sopra per ripetere la
visualizzazione, il datareader risulta empty

cosa vuol dire? dovresti spiegare un attimo meglio che tipo di eccezione ricevi a video. così è poco chiaro.
.

Daniele Bochicchio | ASPItalia.com | Libri
Chief Operating Officer@iCubed
Microsoft Regional Director & MVP
56 messaggi dal 01 marzo 2002
Ciao, grazie per la risposta.

il problema è che il datareader sembra "perdersi" i dati subito dopo averglieli settati con l'executereader.
La cosa mi sta facendo impazzire perchè in altri progetti funziona tutto in maniera identica e senza errori.
Avevo pensato ad una disconnessione per un timeout troppo breve (è comunque quello standard), ma anche aumentandolo il risultato non cambia.
Il ciclo sul reader (e qui sembra una beffa) funziona e richiama correttamente la funzione che non fa altro che caricare un oggetto richiesta con i valori del datareader, che però trova inspiegabilmente vuoti.
ripeto: in debug ho provato a visualizzare i dati nel reader passandoci sopra il mouse e la prima volta che lo faccio, i dati ci sono e sono corretti, le altre volte (senza mandare avanti il programma, ma semplicemente spostando il mouse e riposizionandolo sulla variabile) il datareader risulta empty
56 messaggi dal 01 marzo 2002
Ciao Daniele,

il problema è l'errore lo ricevo solamente al momento dell'utilizzo dei dati nel datareader all'interno della funzione PopolaRichiesta, mentre analizzando la cosa in debug, il datareader risulta vuoto in maniera anomala subito dopo la sua valorizzazione.
Continuo a non capire.
Puoi postare il codice della funzione che popola l'oggetto?

imperugo
Microsoft MVP
myblog : http://www.tostring.it
56 messaggi dal 01 marzo 2002
la funzione è questa:
    private static RichiestaGpp PopolaRichiesta(SqlDataReader reader)
      {
      RichiestaGpp richiesta = new RichiestaGpp();

      // Chiave della richiesta
      richiesta.Id = reader.GetDecimal(reader.GetOrdinal("IdRichiesta"));

      // Tipo della richiesta
      richiesta.TipoRichiesta.Id = reader.GetInt32(reader.GetOrdinal("fkTipoRichiesta"));
      richiesta.TipoRichiesta.Descrizione = reader.GetString(reader.GetOrdinal("DescrizioneTipoRichiesta"));

      // Stato della richiesta
      richiesta.StatoRichiesta.Id = reader.GetInt32(reader.GetOrdinal("fkStatoRichiesta"));
      if (!reader.IsDBNull(reader.GetOrdinal("DescrizioneStatoRichiesta")))
        richiesta.StatoRichiesta.Descrizione = reader.GetString(reader.GetOrdinal("DescrizioneStatoRichiesta"));

      // Utente che ha inserito la richiesta
      richiesta.UtenteInserimento = reader.GetString(reader.GetOrdinal("UtenteInserimento"));

      // Ambiente della richiesta
      richiesta.Ambiente.Id = reader.GetInt32(reader.GetOrdinal("fkAmbiente"));
      richiesta.Ambiente.Nome = reader.GetString(reader.GetOrdinal("NomeAmbiente"));

      // Data di inserimento della richiesta
      richiesta.DataInserimento = reader.GetDateTime(reader.GetOrdinal("dtDataInserimento"));

      // Chiave del cliente
      richiesta.Cliente.Id = reader.GetDecimal(reader.GetOrdinal("fkCliente"));

      return richiesta;
      }


ma il problema è che il datareader che riceve è empty
massimo.narducci ha scritto:
ho provato a visualizzare i dati nel reader passandoci sopra il mouse e la prima volta che lo faccio, i dati ci sono e sono corretti, le altre volte (senza mandare avanti il programma, ma semplicemente spostando il mouse e riposizionandolo sulla variabile) il datareader risulta empty

Certo, è il comportamento normale del datareader che utilizza un cursore di tipo forwardonly; detto in parole povere un datareader è un insieme di elementi in cui ti puoi muovere solo dall'inizio verso la fine, senza possibilità di tornare indietro. Una volta che il cursore raggiunge l'ultimo elemento disponibile (EOF) il metodo Read restituisce false in quanto non è più in grado di proseguire.

Matteo Casati
GURU4.net

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.