sql >> Database >  >> RDS >> Sqlserver

ExecuteScalar vs ExecuteNonQuery bij het retourneren van een identiteitswaarde

Zoals door Aaron wordt gesuggereerd, zou een opgeslagen procedure het sneller maken omdat het Sql Server het werk van het compileren van uw SQL-batch bespaart. U kunt echter nog steeds voor beide benaderingen kiezen:ExecuteScalar of ExecuteNonQuery . IMHO, het prestatieverschil tussen hen is zo klein dat beide methoden net zo "juist" zijn.

Dat gezegd hebbende, zie ik het nut niet in van het gebruik van ExecuteScalar als u de identiteitswaarde uit een uitvoerparameter haalt. In dat geval wordt de waarde geretourneerd door ExecuteScalar nutteloos wordt.

Een benadering die ik leuk vind omdat er minder code voor nodig is, maakt gebruik van ExecuteScalar zonder uitgangsparameters:

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();

        }
    }
}

Veel plezier met programmeren!

BEWERKEN :Merk op dat we twee keer moeten casten:van object naar decimal , en dan naar int (met dank aan techturtle voor het opmerken hiervan).




  1. TypeError:'int' object ondersteunt geen indexering

  2. Inzicht in de timing van de operators van het uitvoeringsplan

  3. Wat doet DELIMITER // in een trigger?

  4. Problemen oplossen AlwaysOn - Soms zijn er veel paar ogen nodig