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