Zoals door Aaron wordt gesuggereerd, zou een opgeslagen procedure het sneller maken omdat het Sql Server het werk van het compileren van uw SQL-batch bespaart. U kunt echter nog steeds voor beide benaderingen kiezen:ExecuteScalar
of ExecuteNonQuery
. IMHO, het prestatieverschil tussen hen is zo klein dat beide methoden net zo "juist" zijn.
Dat gezegd hebbende, zie ik het nut niet in van het gebruik van ExecuteScalar
als u de identiteitswaarde uit een uitvoerparameter haalt. In dat geval wordt de waarde geretourneerd door ExecuteScalar
nutteloos wordt.
Een benadering die ik leuk vind omdat er minder code voor nodig is, maakt gebruik van ExecuteScalar
zonder uitgangsparameters:
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();
}
}
}
Veel plezier met programmeren!
BEWERKEN :Merk op dat we twee keer moeten casten:van object naar decimal
, en dan naar int
(met dank aan techturtle voor het opmerken hiervan).