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

ExecuteScalar vs ExecuteNonQuery al devolver un valor de identidad

Como sugirió Aaron, un procedimiento almacenado lo haría más rápido porque le ahorra a Sql Server el trabajo de compilar su lote de SQL. Sin embargo, aún puede optar por cualquiera de los dos enfoques:ExecuteScalar o ExecuteNonQuery . En mi humilde opinión, la diferencia de rendimiento entre ellos es tan pequeña que cualquier método es igual de "adecuado".

Habiendo dicho eso, no veo el punto de usar ExecuteScalar si está tomando el valor de identidad de un parámetro de salida. En ese caso, el valor devuelto por ExecuteScalar se vuelve inútil.

Un enfoque que me gusta porque requiere menos código, usa ExecuteScalar sin parámetros de salida:

public static int SaveTest(Test newTest)
{
    var conn = DbConnect.Connection();
    const string sqlString = "INSERT INTO dbo.Tests ( Tester , Premise ) " +
                             "               VALUES ( @tester , @premise ) " +
                             "SELECT SCOPE_IDENTITY()";
    using (conn)
    {
        using (var cmd = new SqlCommand(sqlString, conn))
        {
            cmd.Parameters.AddWithValue("@tester", newTest.tester);
            cmd.Parameters.AddWithValue("@premise", newTest.premise);

            cmd.CommandType = CommandType.Text;
            conn.Open();
            return (int) (decimal) cmd.ExecuteScalar();

        }
    }
}

¡Feliz programación!

EDITAR :Tenga en cuenta que necesitamos emitir dos veces:del objeto al decimal y luego a int (gracias a techturtle por notar esto).