Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

ExecuteScalar vs ExecuteNonQuery lors du retour d'une valeur d'identité

Comme suggéré par Aaron, une procédure stockée le rendrait plus rapide car elle évite à Sql Server le travail de compilation de votre lot SQL. Cependant, vous pouvez toujours utiliser l'une ou l'autre approche :ExecuteScalar ou ExecuteNonQuery . À mon humble avis, la différence de performances entre eux est si petite que l'une ou l'autre méthode est tout aussi "appropriée".

Cela dit, je ne vois pas l'intérêt d'utiliser ExecuteScalar si vous récupérez la valeur d'identité d'un paramètre de sortie. Dans ce cas, la valeur renvoyée par ExecuteScalar devient inutile.

Une approche que j'aime car elle nécessite moins de code, utilise ExecuteScalar sans paramètres de sortie :

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();

        }
    }
}

Bonne programmation !

MODIFIER :Notez que nous devons transtyper deux fois :de l'objet vers decimal , puis à int (merci à techturtle pour l'avoir noté).