Jak zasugerował Aaron, procedura składowana przyspieszyłaby to, ponieważ oszczędza Sql Server pracy związanej z kompilacją Twojej partii SQL. Jednak nadal możesz skorzystać z dowolnego podejścia:ExecuteScalar
lub ExecuteNonQuery
. IMHO, różnica w wydajności między nimi jest tak mała, że obie metody są równie „właściwe”.
Powiedziawszy to, nie widzę sensu używania ExecuteScalar
jeśli pobierasz wartość tożsamości z parametru wyjściowego. W takim przypadku wartość zwracana przez ExecuteScalar
staje się bezużyteczny.
Podejście, które lubię, ponieważ wymaga mniej kodu, wykorzystuje ExecuteScalar
bez parametrów wyjściowych:
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();
}
}
}
Miłego programowania!
EDYTUJ :Zauważ, że musimy rzutować dwukrotnie:z obiektu na decimal
, a następnie do int
(dzięki techturtle za odnotowanie tego).