sql >> Databáze >  >> RDS >> Sqlserver

ExecuteScalar vs ExecuteNonQuery při vrácení hodnoty identity

Jak navrhl Aaron, uložená procedura by to zrychlila, protože šetří SQL Server práci s kompilací vaší dávky SQL. Stále však můžete použít kterýkoli přístup:ExecuteScalar nebo ExecuteNonQuery . IMHO je rozdíl ve výkonu mezi nimi tak malý, že obě metody jsou stejně "správné".

Po tom, co jsem řekl, nevidím smysl použití ExecuteScalar pokud získáváte hodnotu identity z výstupního parametru. V takovém případě hodnota vrácená ExecuteScalar se stává zbytečným.

Přístup, který se mi líbí, protože vyžaduje méně kódu, používá ExecuteScalar bez výstupních parametrů:

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

        }
    }
}

Šťastné programování!

UPRAVIT :Všimněte si, že musíme přetypovat dvakrát:z objektu na decimal a poté na int (díky techturtle za upozornění).




  1. Integrace SQLCipher s greenDAO

  2. 2 způsoby, jak vybrat řádky, které odpovídají všem položkám v seznamu (T-SQL)

  3. Psaní volitelných parametrů v rámci uložených procedur v MySQL?

  4. Jaký je nejlepší postup pro vložení záznamu, pokud ještě neexistuje?