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.......