Som föreslagits av Aaron skulle en lagrad procedur göra det snabbare eftersom det sparar SQL Server arbetet med att kompilera din SQL-batch. Du kan dock fortfarande använda båda metoderna:ExecuteScalar
eller ExecuteNonQuery
. IMHO, prestandaskillnaden mellan dem är så liten att båda metoderna är lika "korrekta".
Med det sagt ser jag inte poängen med att använda ExecuteScalar
om du tar tag i identitetsvärdet från en utdataparameter. I så fall returneras värdet av ExecuteScalar
blir värdelös.
Ett tillvägagångssätt som jag gillar eftersom det kräver mindre kod, använder ExecuteScalar
utan utgångsparametrar:
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();
}
}
}
Lycka till med programmeringen!
REDIGERA :Observera att vi måste casta två gånger:från objekt till decimal
och sedan till int
(tack till techturtle för att du noterade detta).