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

ExecuteScalar vs ExecuteNonQuery ved returnering af en identitetsværdi

Som foreslået af Aaron, ville en lagret procedure gøre det hurtigere, fordi det sparer SQL Server arbejdet med at kompilere din SQL-batch. Du kan dog stadig gå med begge metoder:ExecuteScalar eller ExecuteNonQuery . IMHO, præstationsforskellen mellem dem er så lille, at begge metoder er lige "rigtige".

Når det er sagt, kan jeg ikke se meningen med at bruge ExecuteScalar hvis du henter identitetsværdien fra en outputparameter. I så fald returneres værdien af ​​ExecuteScalar bliver ubrugelig.

En tilgang, som jeg kan lide, fordi den kræver mindre kode, bruger ExecuteScalar uden udgangsparametre:

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

        }
    }
}

God programmering!

REDIGER :Bemærk, at vi skal caste to gange:fra objekt til decimal , og derefter til int (tak til techturtle for at bemærke dette).




  1. Sådan får du det aktuelle Auto_Increment-sekvensnummer til MySQL / MariaDB-tabel

  2. Multi-Cloud Full Database Cluster Failover-indstillinger for MariaDB Cluster

  3. Tilslutning af IRI-software til Oracle

  4. Oracle Text fungerer ikke med NVARCHAR2. Hvad ellers kan være utilgængeligt?