Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

ExecuteScalar vs ExecuteNonQuery ao retornar um valor de identidade


Como sugerido por Aaron, um procedimento armazenado o tornaria mais rápido porque economiza o trabalho do Sql Server de compilar seu lote SQL. No entanto, você ainda pode usar qualquer uma das abordagens:ExecuteScalar ou ExecuteNonQuery . IMHO, a diferença de desempenho entre eles é tão pequena, que qualquer um dos métodos é tão "adequado".

Dito isso, não vejo sentido em usar ExecuteScalar se você estiver pegando o valor de identidade de um parâmetro de saída. Nesse caso, o valor retornado por ExecuteScalar torna-se inútil.

Uma abordagem que eu gosto porque requer menos código, usa ExecuteScalar sem parâmetros de saída:
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();

        }
    }
}

Boa programação!

EDITAR :Observe que precisamos converter duas vezes:do objeto para decimal , e depois para int (obrigado a techturtle por notar isso).