Wie von Aaron vorgeschlagen, würde eine gespeicherte Prozedur es schneller machen, da es Sql Server die Arbeit erspart, Ihren SQL-Batch zu kompilieren. Sie können jedoch immer noch beide Ansätze verwenden:ExecuteScalar
oder ExecuteNonQuery
. IMHO ist der Leistungsunterschied zwischen ihnen so gering, dass beide Methoden genauso "richtig" sind.
Allerdings sehe ich keinen Sinn darin, ExecuteScalar
zu verwenden wenn Sie den Identitätswert von einem Ausgabeparameter abrufen. In diesem Fall der von ExecuteScalar
zurückgegebene Wert wird nutzlos.
Ein Ansatz, den ich mag, weil er weniger Code erfordert, verwendet ExecuteScalar
ohne Ausgabeparameter:
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();
}
}
}
Viel Spaß beim Programmieren!
BEARBEITEN :Beachten Sie, dass wir zweimal umwandeln müssen:von Objekt zu decimal
, und dann zu int
(danke an techturtle für den Hinweis).