Както беше предложено от Аарон, съхранената процедура би я направила по-бърза, защото спестява на Sql Server работата по компилирането на вашата SQL партида. Все пак можете да използвате всеки от двата подхода:ExecuteScalar
или ExecuteNonQuery
. IMHO, разликата в производителността между тях е толкова малка, че всеки метод е също толкова "правилен".
След като казах това, не виждам смисъл да използвам ExecuteScalar
ако грабвате стойността на идентичността от изходен параметър. В този случай стойността, върната от ExecuteScalar
става безполезен.
Подход, който харесвам, защото изисква по-малко код, използва ExecuteScalar
без изходни параметри:
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();
}
}
}
Приятно програмиране!
РЕДАКТИРАНЕ :Имайте предвид, че трябва да прехвърляме два пъти:от обект към decimal
, а след това към int
(благодаря на techturtle, че отбеляза това).