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

    [C#] Problema con variabile SqlDataReader

    Non è che programmi C# tutti i giorni quindi non mi ritengo un esperto, ma a volte ci sono delle cose che proprio non riesco a capire, non nel senso che non ci arrivo, nel senso che proprio non condivido alcune scelte di comportamento della logica del codice...

    Ad esempio, mi trovo di fronte a questo problema, per rendere il mio codice quanto mai invulnerabile a errori non gestiti.

    Prendiamo le interrogazioni al database, ecco un esempio di query:

    codice:
    SqlDataReader read;
    read=this.cnnp.GetDataReaderFromDataSet(szQuery);
    Ci troviamo in una routine, read esiste e vive lì dentro, szQuery è stata istanziata e caricata in precedenza, cnnp è un oggetto connessione di modulo già connesso e pronto.

    Fin quì va tutto bene.

    Ora però ho creato una funzioncina privata interna alla classe che non esegue la query secca, ma prova ad eseguirla e fa una serie di operazioni, se al termine di queste operazioni riesce effettivamente a fare la query restituisce True, altrimenti False.

    codice:
    SqlDataReader read;
    if(!this.EseguiQuery(ref read,szQuery))
    	return false;
    EseguiQuery è di tipo bool, ovviamente, il grosso problema è che mi da errore 47 "Utilizzo della variabile locale read non assegnato".

    Allora, read così come l'ho chiamata non è ancora istanziata, ok, usando cnnp.GetDataReaderFromDataSet() la istanzio, ok, però dentro EseguiQuery ad un certo punto io cnnp.GetDataReaderFromDataSet() lo chiamo e tutti dovrebbero vivere felici e contenti.

    Invece lui pretende che read al momento della chiamata di EseguiQuery sia già istanziata, ma visto che read non ha costruttori l'unico modo per istanziarla è richiamare cnnp.GetDataReaderFromDataSet() direttamente, ma questo mi espone a errori che ho gestito dentro EseguiQuery.

    In poche parole, devo istanziare read, ma non posso farlo se prima non eseguo una query, bello vero?

  2. #2
    La situazione alla fine l'ho risolta, mi sono dovuto piegare alle regole talvolta inspiegabili del C#.

    Ho creato due funzioni, una è la solita EseguiQuery, che non cambia rispetto alla sua precedente. Una si chiama EseguiQueryFirst che è un pò diversa.

    La prima (private bool EseguiQuery(ref SqlDataReader read, string szQuery)) prende semplicemente l'oggetto read già istanziato in precedenza, quindi non è possibile usarla se prima a read non va fatto fare un giretto di prova, al suo interno esegue la query e restituisce true se ce la fa, false se da qualche parte va in errore. Inoltre read contiene i risultati.

    La seconda funzioncina è un pò più macchinosa (private bool EseguiQueryFirst(ref object obj, string szQuery)) e come suggerisce il nome va usata giusto per la prima volta dopo l'istruzione SqlDataReader read;

    La differenza è questa:

    Primo caso
    codice:
    ...
    //read è già stato usato in precedenza.
    if(!this.EseguiQuery(ref read, szQuery))
       return false;
    //se non si ritorna false allora si ha a disposizione read caricato con i risultati.
    ...
    Secondo caso
    codice:
    ...
    SqlDataReader read;
    object obj=new object();
    if(!this.EseguiQueryFirst(ref obj, szQuery))
       return false;
    //in obj ci sono i risultati, ma va prima convertito per poterlo utilizzare
    read=(SqlDataReader)obj;
    //ora in read ci sono i risultati, inoltre da adesso è anche utilizzabile
    //con l'altra funzione più semplice
    ...
    All'interno di EseguiQueryFirst è necessario eseguire in questo modo
    codice:
    private bool EseguiQueryFirst(ref object obj, string szQuery){
       SqlDataReader read;
       //operazioni varie all'interno della funzione
       ...
       ...
       ...
       ...
       ...
       //se tutto è andato liscio e la query è stata eseguita
       //il risultato è dentro read, prima del return va quindi copiato
       //dentro obj
       obj=(object)read;
       return true;
    }
    E' stato un parto cesareo e neanche tanto bello, ma così almeno ho ottenuto quello che volevo.......

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.