Vì lợi ích của sự hoàn chỉnh, có ba vấn đề với mẫu mã của bạn.
1) Bạn đang thực hiện truy vấn của mình hai lần bằng cách gọi ExecuteNonQuery
và ExecuteScalar
. Kết quả là, bạn sẽ chèn hai bản ghi vào bảng của mình mỗi khi hàm này chạy. SQL của bạn, trong khi là hai câu lệnh riêng biệt, sẽ chạy cùng nhau và do đó bạn chỉ cần gọi đến ExecuteScalar
.
2) Scope_Identity()
returns a decimal. Bạn có thể sử dụng Convert.ToInt32
trên kết quả truy vấn của mình hoặc bạn có thể truyền giá trị trả về thành số thập phân rồi đến int.
3) Đảm bảo bọc kết nối và các đối tượng lệnh trong các câu lệnh using
để chúng được xử lý đúng cách.
using (SqlConnection connection = new SqlConnection(connectionString))
{
using (SqlCommand command = new SqlCommand(sql, connection))
{
connection.Open();
int tenderId = (int)(decimal)command.ExecuteScalar();
}
}
Nguồn
2010-06-12 07:18:40
bạn đã thử chia thành hai đối tượng SqlCommand chưa? một cho mỗi truy vấn? – luke
loại nào là đấu thầu? –
Bạn nhận ra rằng bạn đang thực hiện sql hai lần và do đó bạn đang chèn bản ghi hai lần. Chỉ cần chạy phương thức ExecuteScalar. –