Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

ExecuteScalar vs ExecuteNonQuery quando si restituisce un valore di identità

Come suggerito da Aaron, una stored procedure lo renderebbe più veloce perché risparmia a SQL Server il lavoro di compilazione del batch SQL. Tuttavia, puoi comunque utilizzare entrambi gli approcci:ExecuteScalar o ExecuteNonQuery . IMHO, la differenza di prestazioni tra loro è così piccola che entrambi i metodi sono altrettanto "corretti".

Detto questo, non vedo il senso di usare ExecuteScalar se stai acquisendo il valore di identità da un parametro di output. In tal caso, il valore restituito da ExecuteScalar diventa inutile.

Un approccio che mi piace perché richiede meno codice, utilizza ExecuteScalar senza parametri di output:

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

        }
    }
}

Buona programmazione!

MODIFICA :Nota che dobbiamo eseguire il cast due volte:da oggetto a decimal , quindi su int (grazie a techturtle per averlo notato).