posts - 644, comments - 2003, trackbacks - 137

My Links

News

Raffaele Rialdi website

Su questo sito si trovano i miei articoli, esempi, snippet, tools, etc.

Archives

Post Categories

Image Galleries

Blogs

Links

Select count(*), ExecuteScalar e NullReferenceException

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.

Print | posted on martedì 23 novembre 2004 23:01 | Filed Under [ ADO.NET [Italiano] ]

Feedback

Gravatar

# re: Select count(*), ExecuteScalar e NullReferenceException

Ciao Luka,
grazie della risposta ma se è così, manca il filo della coerenza. Cioè se chiedo quanti elementi ci sono in un insieme vuoto, la risposta deve essere zero e non un resultset vuoto.
Mi sembra ancora impossibile che non mi sia capitato prima ... veramente incredibile...
24/11/2004 01:32 | Raffaele Rialdi
Gravatar

# re: Select count(*), ExecuteScalar e NullReferenceException

Ciao Marco,
credo che nel caso che tu hai posto il resultset vuoto sia giustissimo.
Credo anche però che sia diverso se nella clausola select sia presente anche un'altro campo.
Parlo di diverso nel senso logico: se chiedo di contare gli elementi di un insieme, mi aspetto di ricevere comunque un numero, anche nel caso dell'insieme vuoto. Diverso è se voglio avere in una colonna del resultset *anche* il count.
Comunque come hai visto non ho certo ggridato al bug perchè capisco sia opinabile anche se non mi piace il comportamento attuale.
24/11/2004 15:00 | Raffaele Rialdi
Gravatar

# re: Select count(*), ExecuteScalar e NullReferenceException

Ottimo sviluppo Luka, quello che mi sarei aspettato (come dicevo anche a Marco) è che quando il group by restituisce zero righe e l'unica colonna è il count(*) allora avrebbe avuto molto senso restituire una riga con zero.
Come invece hai mostrato tu, la coerenza logica c'è, ma è in sola ragione dell'insieme e non tiene conto del count(*) e questo dovrebbe secondo me cambiare tutto.
In sostanza (e forse l'ho già ripetuto troppe volte ;-)) se chiedo quante righe ci sono nell'insieme vuoto, mi aspetto di ricevere una risposta con zero e non il silenzio.
25/11/2004 00:16 | Raffaele Rialdi
Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET