2009-06-25 15 views
5

Se nella stored procedure, eseguo solo un'istruzione, select count(*) from sometable, quindi dal lato client (sto utilizzando C# ADO.Net SqlCommand per richiamare la stored procedure), come posso recuperare il valore count(*)? Sto usando SQL Server 2008.Come recuperare il valore scalare dalla stored procedure (ADO.NET)

Sono confuso perché count(*) non viene utilizzato come parametro del valore di ritorno della stored procedure.

grazie in anticipo, George

risposta

6

O si utilizzare ExecuteScalar come Andrew suggerito - o si dovrà modificare il codice un po ':

CREATE PROCEDURE dbo.CountRowsInTable(@RowCount INT OUTPUT) 
AS BEGIN 
    SELECT 
    @RowCount = COUNT(*) 
    FROM 
    SomeTable 
END 

e quindi utilizzare questa chiamata ADO.NET per recuperare il valore:

using(SqlCommand cmdGetCount = new SqlCommand("dbo.CountRowsInTable", sqlConnection)) 
{ 
    cmdGetCount.CommandType = CommandType.StoredProcedure; 

    cmdGetCount.Parameters.Add("@RowCount", SqlDbType.Int).Direction = ParameterDirection.Output; 

    sqlConnection.Open(); 

    cmdGetCount.ExecuteNonQuery(); 

    int rowCount = Convert.ToInt32(cmdGetCount.Parameters["@RowCount"].Value); 

    sqlConnection.Close(); 
} 

Marc

PS: ma in questo esempio concreto, suppongo che l'alternativa con l'esecuzione appena ExecuteScalar sia più semplice e più facile da capire. Questo metodo potrebbe funzionare correttamente, se è necessario restituire più di un singolo valore (ad esempio conteggi di più tabelle o simili).

+0

Grazie a @Marc, ho testato la tua soluzione! Freddo! – George2

6

Quando si esegue la chiamata di query ExecuteScalar - Ciò restituirà il risultato.

Esegue la query e restituisce la prima colonna della prima riga nel set di risultati restituito dalla query. Le colonne o le righe aggiuntive vengono ignorate.

Poiché si restituisce solo un valore, questo restituirà solo il valore dall'espressione count. Dovrai trasmettere il risultato di questo metodo a un int.

+1

In questo caso, è necessario fare: SELECT yourvalue - e non ritornano yourvalue – Zanoni

+0

"quello che devi fare: SELECT yourvalue - e non ritornano yourvalue" - confuso, che cosa vuoi dire? Potresti spiegare di più per favore? – George2

+0

@Andrew, mi piace la tua risposta, ma dopo aver letto la risposta di Marc, penso che il modo più elegante dovrebbe usare il valore di ritorno della procedura di archiviazione, eventuali commenti? – George2

1

La risposta di marc_s ha funzionato bene per intero. ma per varchar la lunghezza deve essere specificata.

cmdGetCount.Parameters.Add("@RowCount", SqlDbType.varchar,30).Direction = ParameterDirection.Output; 
Problemi correlati