2009-05-31 20 views
6

Tôi đang sử dụng ADO.NET Datasets trong các ứng dụng VB của tôi. Tôi có một tập dữ liệu đã nhập với một bảng cha và nhiều bảng con. Tôi muốn tạo khóa Identity khi tôi chèn dữ liệu vào bảng cha và sau đó cập nhật dữ liệu trong tất cả các bảng con với khóa tương tự (như khóa Foregin).Làm cách nào để cập nhật Bảng dữ liệu cha mẹ và con bằng khóa nhận dạng tự động?

Cuối cùng, tôi muốn cập nhật tập dữ liệu trong Cơ sở dữ liệu (SQL Server08).

Vâng, điều trên có thể thực hiện được bằng cách chèn bảng cha mẹ vào cơ sở dữ liệu trực tiếp, lấy cột Identity và sử dụng cho bảng con.

Nhưng tôi muốn đây là một hoạt động tự động (Giống như LINQ to SQL mà sẽ chăm sóc của Tiểu & chính nước ngoài tại DataContext.)

tôi điều như vậy có thể trong Dataset mà sẽ chăm sóc của cột autogenerated cho mẹ và con những cái bàn?

Cảm ơn,

ABB

Trả lời

4

Tôi nghĩ rằng điều này sẽ rõ ràng hơn và nên hoạt động mà không cần phải chỉnh sửa. Nhưng vẫn còn, nó khá dễ dàng.

Các giải pháp có hai phần:

  1. Tạo DataRelation giữa bảng con và phụ huynh và đặt nó là thác trên bản cập nhật. Bằng cách đó, bất cứ khi nào ID mẹ thay đổi, tất cả trẻ em sẽ được cập nhật.

    Dim rel = ds.Relations.Add(parentTab.Columns("Id"), childTab.Columns("ParentId")) 
    rel.ChildKeyConstraint.UpdateRule = Rule.Cascade 
    
  2. Dataset chèn và cập nhật lệnh là hai chiều: Nếu có bất kỳ thông số đầu ra đóng thành quyển hoặc bất kỳ hàng dữ liệu trả về, họ sẽ được sử dụng để cập nhật hàng dữ liệu gây ra bản cập nhật.

    Điều này hữu ích nhất cho vấn đề cụ thể này: nhận cột tự động phát hiện quay lại ứng dụng. Ngoài danh tính, ví dụ này có thể là cột dấu thời gian. Nhưng danh tính là hữu ích nhất.

    Tất cả những gì chúng ta cần làm là đặt lệnh chèn để trả về danh tính. Có một số cách để thực hiện, ví dụ:

    a) Sử dụng thủ tục lưu sẵn với thông số đầu ra. Đây là cách di động nhất trong số các cơ sở dữ liệu "thực".

    b) Sử dụng nhiều câu lệnh SQL, với câu lệnh trả về cuối cùng được chèn vào. Đây là AFAIK cụ thể cho SQL Server, nhưng đơn giản nhất:

    insert into Parent (Col1, Col2, ...) values (@Col1, @Col2, ...); 
    select * from Parent where Id = SCOPE_IDENTITY(); 
    

Sau khi thiết lập này, tất cả các bạn cần làm là tạo ra các hàng mẹ với Id s mà là duy nhất (trong vòng dữ liệu duy nhất) nhưng không thể trong kho dữ liệu. Số âm thường là lựa chọn tốt.Sau đó, khi bạn lưu các thay đổi tập dữ liệu vào cơ sở dữ liệu, tất cả các hàng cha mẹ mới sẽ nhận được Id thực từ cơ sở dữ liệu.


Lưu ý: Nếu bạn tình cờ làm việc với cơ sở dữ liệu mà không cần nhiều báo cáo hỗ trợ và không có thủ tục lưu trữ (ví dụ Access), bạn sẽ cần phải xử lý sự kiện thiết lập trên RowUpdated sự kiện trong bộ chuyển đổi bảng cha. Trong hanler, bạn cần có được danh tính với lệnh select @@IDENTITY.


Một số liên kết:

3

Vài điều cần chỉ ra.

  1. Có, bạn chắc chắn cần quan hệ được gán cho cả hai bảng. Bạn có thể kiểm tra từ trình soạn thảo xsd (nhấp đúp vào tệp xsd của bạn). Theo mặc định, quan hệ được đặt là 'chỉ quan hệ' không có 'quy tắc cập nhật' nào. Chỉnh sửa mối quan hệ này bằng cách đi vào 'chỉnh sửa quan hệ' và chọn 'Khóa ngoại khóa chỉ' hoặc 'Cả hai ~~~' một. Và cần đặt 'Quy tắc cập nhật' là Cascade! 'Xóa quy tắc' tùy thuộc vào bạn. Bây giờ khi bạn sử dụng ID hàng mới của bảng cha (AutoIncrement) cho hàng mới của bảng con là khóa ngoài, bạn phải thêm hàng cha mẹ vào bảng trước tiên trước khi bạn sử dụng ID của hàng cha mẹ mới xung quanh.

  2. Ngay sau khi bạn gọi Cập nhật cho bảng cha bằng cách sử dụng tableadapter, các hàng mới của bảng con được liên kết sẽ có parentID TỰ ĐỘNG TỰ ĐỘNG.

My đơn giản đoạn mã:

'--- Make Parent Row 
Dim drOrder as TOrderRow = myDS.TOder.NewTOrderRow 
drOrder.SomeValue = "SomeValue" 
myDS.TOrder.AddTOrderRow(drOrder) '===> THIS SHOULD BE DONE BEFORE CHILD ROWS 

'--- Now Add Child Rows!!! there are multiple ways to add a row into tables.... 
myDS.TOrderDetail.AddTOrderDetailRow(drOrder, "detailValue1") 
myDS.TOrderDetail.AddTOrderDetailRow(drOrder, "detailvalue2") 
'.... 
'.... 

'--- Update Parent table first 
myTableAdapterTOrder.Update(myDS.TOrder) 
'--- As soon as you run this Update above for parent, the new parent row's AutoID(-1) 
'--- will become real number given by SQL server. And also new rows in child table will 
'--- have the updated parentID 

'--- Now update child table 
myTableAdapterTOrderDetail.Update(myDS.TOrderDetail) 

Tôi hy vọng nó sẽ giúp!

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