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