2010-06-12 22 views
9

Tôi nhận được ngoại lệ: "Dàn diễn viên cụ thể là không hợp lệ", đây là mãdiễn viên cụ thể là không hợp lệ, trong khi lấy SCOPE_IDENTITY

con.Open(); 
string insertQuery = @"Insert into Tender (Name, Name1, Name2) values ('Val1','Val2','Val3');Select Scope_Identity();"; 

SqlCommand cmd = new SqlCommand(insertQuery, con); 
cmd.ExecuteNonQuery(); 
tenderId = (int)cmd.ExecuteScalar(); 
+0

bạn đã thử chia thành hai đối tượng SqlCommand chưa? một cho mỗi truy vấn? – luke

+1

loại nào là đấu thầu? –

+1

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

Trả lời

20

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 ExecuteNonQueryExecuteScalar. 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(); 
    } 
} 
2

thử nghiệm đầu tiên sau:

object id = cmd.ExcuteScalar() 

Set một điểm ngắt và xem loại id. Đây có thể là Decimal và không thể được truyền trực tiếp tới int.

+0

Nó không phải là cột ID là vấn đề, nó là giá trị trả về của 'Scope_Identity()'. Nhưng bạn nói đúng về phần thập phân. –

1

cần Convert.ToInt32 (cmd.ExecuteScalar());

5

Hãy thử điều này: -

con.Open(); 
string insertQuery = @"Insert into Tender (Name, Name1, Name2) values ('Val1','Val2','Val3');Select Scope_Identity();"; 

SqlCommand cmd = new SqlCommand(insertQuery, con); 
tenderId = Convert.ToInt32(cmd.ExecuteScalar()); 

EDIT

Nó phải được điều này vì nó chỉ đúng ra rằng SCOPE_IDENTITY() trả về một số (38,0): -

tenderId = Convert.ToInt32(cmd.ExecuteScalar()); 

Lưu ý: Bạn vẫn cần xóa: -

cmd.ExecuteNonQuery(); 
+4

'Scope_Identity()' trả về một số thập phân. Các diễn viên trực tiếp sẽ không làm việc, nhưng một diễn viên đôi sẽ '(int) (thập phân) cmd.ExecuteScalar()' hoặc chỉ đơn giản là sử dụng 'Convert.ToInt32'. –

+0

@anthony, vâng bạn là chính xác, đã lâu rồi kể từ khi tôi sử dụng loại mã này – Rippo

Các vấn đề liên quan