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é).