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í).