Ответ 1
Как было предложено Aaron, хранимая процедура сделает ее более быстрой, поскольку она сохраняет 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 за это замечание).