2012-04-18 33 views
5

Tôi có một mã như dưới đây, nơi tôi cố gắng chèn dữ liệu vào một bảng và trả về ID (được tự động gia tăng) của phần tử mới.ExecuteScalar() trả về dữ liệu độ dài rỗng đã được thêm vào DB

int newEquipmentID = new int(); 

query = database.ParameterizedQueryString("INSERT INTO Equipment (EquipmentTypeID) VALUES ({0})", "equipmenttypeID"); 

newEquipmentID = (int)database.Connection.ExecuteScalar(query, DefaultTimeout, equipment.EquipmentTypeID); 

Nhưng không thành công và trả về giá trị rỗng, như thể mục mới chưa được thêm. Nhưng trên thực tế tôi có thể thấy mục mới làm cho một tư vấn đơn giản tại DB.

Câu hỏi của tôi là "khi nào" dữ liệu thực sự được thêm vào DB và làm cách nào tôi có thể nhận được ID của mục được thêm mới. Cảm ơn!

Trả lời

11

Bạn không cần hai bước tìm kiếm để tạo ra các kỷ lục mới và lấy giá trị bản sắc mới:

using (var con = new SqlConnection(ConnectionString)) { 
    int newID; 
    var cmd = "INSERT INTO foo (column_name)VALUES (@Value);SELECT CAST(scope_identity() AS int)"; 
    using (var insertCommand = new SqlCommand(cmd, con)) { 
     insertCommand.Parameters.AddWithValue("@Value", "bar"); 
     con.Open(); 
     newID = (int)insertCommand.ExecuteScalar(); 
    } 
} 

Side-Note: Tôi sẽ không sử dụng Database-Class như vậy kể từ it's prone to errors.

2

Để trở về id của hàng chỉ chèn bạn cần phải chọn nó, vì ExecuteScalar() lợi nhuận

cột đầu tiên của dòng đầu tiên trong tập kết quả trả về bởi truy vấn

INSERT không chọn/trả lại bất cứ điều gì.

insert ... 
select ... 

Xem câu trả lời của @ Tim để biết thêm chi tiết.

+0

tất nhiên ... đó là lý do tại sao tôi đang sử dụng ExecuteScalar() –

+0

ExecuteScalar() trả về lĩnh vực đầu tiên của một nguyên tố (dòng yếu tố cột trên bên trái) –

+0

@abatischchev, vì vậy ... –

1

Truy vấn SQL của bạn không trả lại Id mới được tạo. Để trở về nó, sử dụng một OUTPUT clause:

INSERT INTO Equipment (<list of fields>) 
    OUTPUT inserted.EquipmentTypeID 
VALUES (<list of values>) 

Một số điều cần phải cẩn thận về:

  • <list of fields> đại diện cho một dấu phẩy tách ra danh sách các cột mà bạn sẽ cung cấp giá trị
  • danh sách các lĩnh vực không nên bao gồm cột ID tăng tự động (sẽ tự động được gán giá trị)
  • <list of values> đại diện cho danh sách giá trị được phân tách bằng dấu phẩy mũ sẽ được chèn vào trong các trường được chỉ định ở trên. Số lượng các giá trị nên bằng với số lĩnh vực và các kiểu dữ liệu phải phù hợp
0

Điều khoản OUTPUT sẽ giúp bạn lấy ID của mục được thêm mới. Để biết thêm thông tin, vui lòng xem liên kết bên dưới:

Nhấp here! để xem chi tiết hơn

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