Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 19
  1. #1

    C# Datareader...dove sbaglio?

    Salve ragazzi sto scrivendo una semplice classe con un metodo che ha il compito di avvalorare delle proprietà.

    ecco il metodo:

    codice:
    public void PopolaOggetto(int idFilm,string connString)
    {
            string query;
            query = "Select * from tblScheda where ID=" + idFilm;
    			
    	OleDbConnection objConn = new OleDbConnection(connString); 
    	objConn.Open(); 
    
    	OleDbCommand myCommand = new OleDbCommand(query,objConn); 
    	OleDbDataReader myDataReader = myCommand.ExecuteReader();   
    			
    	if (myDataReader.HasRows) 
    	{
    		this.titolo = myDataReader.GetString(1);
    	}			
    
    }
    Le variabili sono tutte avvalorate;
    cmq mi ritorna il seguente errore:


    codice:
    Nessun dato esistente per la riga/colonna. 
    Descrizione: Eccezione non gestita durante l'esecuzione della richiesta Web corrente. Per ulteriori informazioni sull'errore e sul suo punto di origine nel codice, vedere l'analisi dello stack. 
    
    Dettagli eccezione: System.InvalidOperationException: Nessun dato esistente per la riga/colonna.
    
    Errore nel codice sorgente: 
    
    
    Riga 45: 			if (myDataReader.HasRows) 
    Riga 46: 			{
    Riga 47: 				this.titolo = myDataReader.GetString(1);
    Riga 48: 			}			
    Riga 49:
    la riga incriminata è la 47!
    Aikon

    ...questo business è binario: o sei 1 o sei 0, vivo o morto, non esistono secondi classificati!

  2. #2
    Utente di HTML.it L'avatar di donaz
    Registrato dal
    Jan 2002
    Messaggi
    206
    Senza saper nè leggere e nè scrivere dire di controllare cosa restituisce la query prova a metterci subito dopo una

    response.write (query)
    response.end

    così vedi copiandola e facendola eseguire in access cosa ti restituisce.
    Cordialità Donaz

  3. #3
    Originariamente inviato da donaz
    Senza saper nè leggere e nè scrivere dire di controllare cosa restituisce la query prova a metterci subito dopo una

    response.write (query)
    response.end

    così vedi copiandola e facendola eseguire in access cosa ti restituisce.
    La query è fin troppo banale

    query = "Select Top 10 titolo from tblScheda Order By Cdate(data) desc";

    naturalmente restituisce records.
    Aikon

    ...questo business è binario: o sei 1 o sei 0, vivo o morto, non esistono secondi classificati!

  4. #4
    Utente di HTML.it L'avatar di donaz
    Registrato dal
    Jan 2002
    Messaggi
    206
    scusa l'osservazione, forse, banale ma la query che effettui nella classe è diversa da quella che hai postato dopo.
    Stando alla descrizione dell'errore sembra che in getstring non ci sia nulla, questo o perchè non ci va nulla oppure perchè chiamo qualcosa che non esiste. Ti sembra?
    Cordialità Donaz

  5. #5
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    151
    prima di richiamare il valore della riga devi invocare il metodo Read() del datareader

    myDataReader.Read()

    che posiziona il tuo datareader sulla prima riga dei dati restituiti dalla query

  6. #6
    Originariamente inviato da donaz
    scusa l'osservazione, forse, banale ma la query che effettui nella classe è diversa da quella che hai postato dopo.
    Stando alla descrizione dell'errore sembra che in getstring non ci sia nulla, questo o perchè non ci va nulla oppure perchè chiamo qualcosa che non esiste. Ti sembra?
    scusami hai ragione ho copiato la query sbagliata; quella giusta è questa:

    query = "Select * from tblScheda where ID=1";

    La cosa strana è che il metodo myDataReader.HasRows mi ritorna il valore true il che sta ad indicare che ha trovato la riga.
    Aikon

    ...questo business è binario: o sei 1 o sei 0, vivo o morto, non esistono secondi classificati!

  7. #7
    Originariamente inviato da hankmccoy
    prima di richiamare il valore della riga devi invocare il metodo Read() del datareader

    myDataReader.Read()

    che posiziona il tuo datareader sulla prima riga dei dati restituiti dalla query
    Ok ho modificato il codice:

    codice:
    public void PopolaOggetto(int idFilm,string connString)
    {
    	string query;
    	query = "Select * from tblScheda where ID=" + idFilm;
    			
    	OleDbConnection objConn = new OleDbConnection(connString); 
    	objConn.Open(); 
    
    	OleDbCommand myCommand = new OleDbCommand(query,objConn); 
    	OleDbDataReader myDataReader = myCommand.ExecuteReader();   
    	myDataReader.Read();
    	if (myDataReader.HasRows) 
    	{
    		this.titolo = myDataReader.GetString(1);
    	}			
    
    }
    Ora però mi ritorna il seguente errore:

    codice:
    Generata eccezione di tipo System.StackOverflowException. 
    Descrizione: Eccezione non gestita durante l'esecuzione della richiesta Web corrente. Per ulteriori informazioni sull'errore e sul suo punto di origine nel codice, vedere l'analisi dello stack. 
    
    Dettagli eccezione: System.StackOverflowException: Generata eccezione di tipo System.StackOverflowException.
    
    Errore nel codice sorgente: 
    
    Durante l'esecuzione della richiesta Web corrente è stata generata un'eccezione non gestita. Per informazioni sull'origine e la posizione dell'eccezione, vedere l'analisi dello stack dell'eccezione riportata di seguito.  
    
    Analisi dello stack: 
    
    
    [StackOverflowException: Generata eccezione di tipo System.StackOverflowException.]
    Cosa è successo ora?
    Aikon

    ...questo business è binario: o sei 1 o sei 0, vivo o morto, non esistono secondi classificati!

  8. #8
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,887
    devi effettuare una read sul datareader altrimenti la posizione del cursore è a -1

  9. #9
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,887
    non avevo visto il tuo ultimo post...

    Originariamente inviato da TheAikon
    Ok ho modificato il codice:

    codice:
    public void PopolaOggetto(int idFilm,string connString)
    {
    	string query;
    	query = "Select * from tblScheda where ID=" + idFilm;
    			
    	OleDbConnection objConn = new OleDbConnection(connString); 
    	objConn.Open(); 
    
    	OleDbCommand myCommand = new OleDbCommand(query,objConn); 
    	OleDbDataReader myDataReader = myCommand.ExecuteReader();   
    	myDataReader.Read();
    	if (myDataReader.HasRows) 
    	{
    		this.titolo = myDataReader.GetString(1);
    	}			
    
    }
    per ogni operazione "critica" (come un'accensione di una
    connessione ed una lettura di records) isola sempre il blocco (dall'istanza della connessione alla executeReader)
    in un try ... catch ... finally per gestire le eventuali
    eccezioni e visualizzale con la loro proprietà .message, dovrebbe essere più comprensibile..Certo che quella li (StackOverflow) è un po' ambigua...

  10. #10
    Non e' cosi che si legge un datareader.
    Qualsiasi documentazione indica la necessita' di leggere un datareader dal primo all'ultimo record indipendentemente dal fatto che ci sia 1 solo record oppure n records.
    Quindi ad esempio su msdn trovi http://tinyurl.com/cgcnp
    codice:
    OleDbDataReader myReader;
       myReader = myCommand.ExecuteReader();
       // Always call Read before accessing data.
       while (myReader.Read()) {
          Console.WriteLine(myReader.GetInt32(0) + ", " + myReader.GetString(1));
       }
       // always call Close when done reading.
       myReader.Close();
       // Close the connection when done with it.
       myConnection.Close();
    Saluti a tutti
    Riccardo

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.