sql >> Databasteknik >  >> RDS >> Sqlserver

ExecuteScalar vs ExecuteNonQuery när ett identitetsvärde returneras

Som föreslagits av Aaron skulle en lagrad procedur göra det snabbare eftersom det sparar SQL Server arbetet med att kompilera din SQL-batch. Du kan dock fortfarande använda båda metoderna:ExecuteScalar eller ExecuteNonQuery . IMHO, prestandaskillnaden mellan dem är så liten att båda metoderna är lika "korrekta".

Med det sagt ser jag inte poängen med att använda ExecuteScalar om du tar tag i identitetsvärdet från en utdataparameter. I så fall returneras värdet av ExecuteScalar blir värdelös.

Ett tillvägagångssätt som jag gillar eftersom det kräver mindre kod, använder ExecuteScalar utan utgångsparametrar:

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

        }
    }
}

Lycka till med programmeringen!

REDIGERA :Observera att vi måste casta två gånger:från objekt till decimal och sedan till int (tack till techturtle för att du noterade detta).




  1. Hur undviker man att SSIS FTP-uppgiften misslyckas när det inte finns några filer att ladda ner?

  2. implodera en lista för användning i en python MySQLDB IN-sats

  3. Arkitektur och inställning av minne i PostgreSQL-databaser

  4. MySQL:Visa med Subquery i FROM-klausulens begränsning