Theo đề xuất của Aaron, một thủ tục được lưu trữ sẽ làm cho nó nhanh hơn vì nó tiết kiệm cho Sql Server công việc biên dịch lô SQL của bạn. Tuy nhiên, bạn vẫn có thể sử dụng một trong hai cách tiếp cận:ExecuteScalar
hoặc ExecuteNonQuery
. IMHO, sự khác biệt về hiệu suất giữa chúng rất nhỏ, nên cả hai phương pháp đều là "thích hợp".
Đã nói rằng, tôi không hiểu việc sử dụng ExecuteScalar
nếu bạn đang lấy giá trị nhận dạng từ một tham số đầu ra. Trong trường hợp đó, giá trị được trả về bởi ExecuteScalar
trở nên vô dụng.
Một cách tiếp cận mà tôi thích vì nó yêu cầu ít mã hơn, sử dụng ExecuteScalar
không có tham số đầu ra:
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();
}
}
}
Chúc bạn lập trình vui vẻ!
CHỈNH SỬA :Lưu ý rằng chúng ta cần truyền hai lần:từ đối tượng sang decimal
, rồi đến int
(cảm ơn techturtle đã lưu ý điều này).