2009-06-25 17 views
5

Si en el procedimiento almacenado, simplemente ejecuto una instrucción, select count(*) from sometable, luego desde el lado del cliente (estoy usando C# ADO.Net SqlCommand para invocar el procedimiento almacenado), ¿cómo podría recuperar el valor count(*)? Estoy usando SQL Server 2008.Cómo recuperar el valor escalar del procedimiento almacenado (ADO.NET)

Estoy confundido porque count(*) no se usa como parámetro de valor devuelto del procedimiento almacenado.

gracias de antemano, George

Respuesta

6

Cualquiera que utilice ExecuteScalar como Andrew sugirió - o tendrá que cambiar su código un poco:

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

y luego utilizar esta llamada ADO.NET para recuperar el valor:

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

PD: pero en este ejemplo concreto, supongo que la alternativa con solo ejecutar ExecuteScalar es más simple y más fácil de entender. Este método podría funcionar correctamente, si necesita devolver más de un valor (por ejemplo, recuentos de varias tablas o similares).

+0

Gracias @Marc, ¡he probado que su solución funciona! ¡Guay! – George2

6

Cuando se ejecuta la llamada consulta ExecuteScalar - esto va a devolver el resultado.

Ejecuta la consulta y devuelve la primera columna de la primera fila en el conjunto de resultados devuelto por la consulta. Se ignoran columnas o filas adicionales.

Dado que solo está devolviendo un valor, esto devolvería solo el valor de su expresión count. Deberá enviar el resultado de este método a int.

+1

En este caso, lo que necesita hacer: SELECT YOURVALUE - y no regresar YOURVALUE – Zanoni

+0

"que tiene que hacer: SELECT YOURVALUE - y no regresar YOURVALUE" - confundido, ¿qué quiere decir? ¿Podrías explicar más por favor? – George2

+0

@ Andrew, me gusta su respuesta, pero después de leer la respuesta de Marc, creo que la forma más elegante debe usar el valor de retorno del procedimiento de la tienda, ¿algún comentario? – George2

1

marc_s respuesta funcionó bien para entero. pero para varchar la longitud debe ser especificada.

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