2009-04-06 10 views
7

Utilizzando il metodo ExecuteScalar nell'oggetto Comando SQL, come è possibile verificare se il set di risultati è vuoto? Sto usando ASP.net, C# e MS SQL 2008. In questo momento quando eseguo il codice seguente Response.Write restituisce un quando il set di risultati è vuoto. Ma mi piacerebbe distinguere tra e set di risultati vuoti perché ci sono valori effettivi nel mio database.Utilizzando l'oggetto Comando SQL, come è possibile verificare se il set di risultati è vuoto?

Ecco il codice corrente dietro:

cmd = new SqlCommand("usp_test", cn); 
cmd.CommandType = CommandType.StoredProcedure; 

cn.Open(); 
TestOuput = Convert.ToInt32(cmd.ExecuteScalar()); 
cn.Close(); 

Response.Write(TestOutput); 

Grazie.

+0

Perché non in SQL inserire ISNULL (@ Return, 0). Quindi, tutto può essere convertito in Int32. –

risposta

12

Verificare la definizione di ExecuteScalar. Restituisce un oggetto, che avrà un riferimento null se il set di risultati è vuoto.

Il motivo per cui si sta vedendo zero è che Convert.ToInt32 restituisce uno zero quando viene assegnato null. È necessario verificare il valore restituito da ExecuteScalar prima di convertirlo in un int.

+0

@bdukes, buona aggiunta. Grazie. – Kon

3

DbCommand.ExecuteScalar() restituisce la prima colonna della prima riga o null se il risultato è vuoto. Il tuo problema è causato da Convert.ToInt32() perché restituisce 0 per null.

È necessario controllare il valore restituito da ExecuteScalar() per null e chiamare solo Convert.ToInt32() se non è null.

Object result = command.ExecuteScalar(); 

if (result != null) 
{ 
    Int32 value = Convert.ToInt32(result); 
} 
else 
{ 
    // Handle the empty result set case 
} 
0

Come si può vedere in here è possibile verificare se il risultato è nullo:

Valore restituito Tipo: System.Object La prima colonna della prima riga in set di risultati, o un riferimento null (Niente in Visual Basic) se il set di risultati è vuoto.

0

Esegui scalare restituirà la prima colonna della prima riga nel set di risultati. Se non ci sono risultati, dovrebbe restituire null.

mia ipotesi è che la stored procedure restituisce un conteggio e non il set di dati, che è il motivo per cui si sta vedendo uno 0.

0

ExecuteScalar rendimenti null se il set di risultati è vuoto (come @fallen888, et al. Hanno disse). Il motivo per cui stai vedendo zero è che Convert.ToInt32 restituisce uno zero quando viene dato null. È necessario verificare il valore restituito da ExecuteScalar prima di convertirlo in un int.

0
cmd = new SqlCommand("usp_test", cn); 
cmd.CommandType = CommandType.StoredProcedure; 
cn.Open(); 
Object outPut=cmd.ExecuteScalar(); 
if(outPut!=null) 
TestOuput = Convert.ToInt32(outPut); 
else 
//Return Empty Set 
cn.Close(); 

Response.Write(TestOutput); 
Problemi correlati