sql >> Base de Datos >  >> RDS >> Sqlserver

Acceso al parámetro de salida del procedimiento almacenado de SQL Server en C#

Te sugiero que pongas tu SqlConnection y SqlCommand en el uso de bloques para garantizar su correcta eliminación.

Además, si no me equivoco, los parámetros de salida solo están disponibles después de haber leído completamente el conjunto de datos resultante que se devuelve.

Dado que no parece necesitar eso en absoluto, ¿por qué no usar .ExecuteNonQuery()? ¿en cambio? ¿Eso soluciona el problema?

using (SqlConnection con = new SqlConnection("Data Source=localhost\\SQLEXPRESS;Initial Catalog=answers;Integrated Security=True"))
using (SqlCommand cmd = new SqlCommand("dbo.GetRowCount", con))
{
    cmd.CommandType = CommandType.StoredProcedure;

    cmd.Parameters.Add(new SqlParameter("@count", SqlDbType.Int));
    cmd.Parameters["@count"].Direction = ParameterDirection.Output;

    con.Open();
    cmd.ExecuteNonQuery();  // *** since you don't need the returned data - just call ExecuteNonQuery
    int ans = (int)cmd.Parameters["@count"].Value;
    con.Close();

    Console.WriteLine(ans);
}

Además:dado que parece que solo está realmente interesado en el recuento de filas, ¿por qué no simplificar su procedimiento almacenado a algo como esto:

ALTER PROCEDURE GetRowCount
AS
   SELECT COUNT(*) FROM Emp WHERE age > 30;

y luego use este fragmento en su código C#:

    con.Open();

    object result = cmd.ExecuteScalar();

    if(result != null)
    {
        int ans = Convert.ToInt32(result);
    }

    con.Close();