Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

ExecuteScalar vs. ExecuteNonQuery beim Zurückgeben eines Identitätswerts

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