In sintesi il problema è l'esecuzione con ExecuteScalar di una “select count(*) ...“.
Non so per quale strano destino non mi sia mai capitato prima ma questa banale operazione mi ha fatto perdere una mezzoretta per capire come mai la ExecuteScalar (su SQL Server 2000 SP3) lanciava una NullReferenceException.
Per prima cosa controllo sotto debugger che il command sia valido, che la connection sia corretta e aperta, che i parameters siano popolati correttamente .... insomma tutto senza problemi ma la NullReferenceException continua ad imperversare.
Da una select count(*) non mi aspettavo altro che un banale intero ma ecco che lanciando il comando nel query analyzer scopro che .... alcune volte la select count(*) ritorna un resultset vuoto!. Alcune volte non significa che il comportamento è randomico ma per esempio capita quando c'è la clausola “group by“.
Forse per alcuni è una banalità ma io mi aspettavo un più tradizionale “0” e cioè un resultset di una riga ed una colonna con un intero nell'unica riga.
Ovviamente ado.net non ne può nulla perchè se il resultset non c'è non può accadere nulla di diverso visto che la ExecuteScalar ha proprio come scopo quello di tornare il risultato della prima cella del resultset che quindi deve esistere.
Spero solo che esista un ottimo motivo nello standard SQL per cui certe volte questo possa accadere.