2011-09-02 18 views
10

Tôi đang cố gắng xóa dữ liệu được tải vào tập dữ liệu và đã liên quan. Đây là mã tôi đã thử.Làm cách nào để xóa dữ liệu có thể định cấu hình khỏi tập dữ liệu (có một loạt các mối quan hệ)

domain.EnforceConstraints = false; 
if (domain.Tables["TABLE_NAME"] != null) 
{ 
    domain.Tables["TABLE_NAME"].ChildRelations.Clear(); 
    domain.Tables["TABLE_NAME"].ParentRelations.Clear(); 
    domain.Tables.Remove("TABLE_NAME"); 
} 
domain.EnforceConstraints = true; 

Điều này ném ngoại lệ tại điểm loại bỏ bảng, do ràng buộc khóa ngoài hiện có. Thật không may, cách logic là tôi không có ý tưởng những gì tên của ràng buộc là [vì vậy tôi không thể mã cứng nó].

Có cách nào để thực hiện điều này theo cách dễ dàng hơn hoặc tôi có thể nhận được một số đề xuất về cách xác định và loại bỏ ràng buộc gây ra sự cố của tôi.

Xin cảm ơn trước, Steve

-------------------------- TRẢ LỜI ---------- --------------

Tôi không được phép trả lời câu hỏi của riêng mình, vì vậy, đây là giải pháp mà tôi đã đưa ra. Đoạn mã này hiện hoạt động cho tôi. Tôi đã phải đi quan hệ với bảng khác và loại bỏ ràng buộc từ đó.

if (domain.Tables["TABLE_NAME"] != null) 
    { 

     for (int f = domain.Tables["TABLE_NAME"].ChildRelations.Count -1; f >=0; f--) 
     { 
      domain.Tables["TABLE_NAME"].ChildRelations[f].ChildTable.Constraints.Remove(domain.Tables["TABLE_NAME"].ChildRelations[f].RelationName); 
      domain.Tables["TABLE_NAME"].ChildRelations.RemoveAt(f); 
     } 
     domain.Tables["TABLE_NAME"].ChildRelations.Clear(); 
     domain.Tables["TABLE_NAME"].ParentRelations.Clear(); 
     domain.Tables["TABLE_NAME"].Constraints.Clear(); 
     domain.Tables.Remove("TABLE_NAME"); 
    } 
+0

miền là một tập dữ liệu (kiểu System.Data.Dataset) nhưng có, các dữ liệu ban đầu được nạp từ SQL SERVER 2005 – Steve

+0

@ Chris ông đang làm việc trong bộ nhớ với các đối tượng ADO.NET, cơ sở dữ liệu không có liên quan trong ngữ cảnh này. –

+0

Tôi thấy rằng tôi không cần phải thực hiện ba dòng tên miền.Tables ["TABLE_NAME"]. ChildRelations.Clear(); domain.Tables ["TABLE_NAME"]. ParentRelations.Clear(); domain.Tables ["TABLE_NAME"]. Constraints.Clear(); –

Trả lời

5

trước khi bạn loại bỏ các bảng từ các tập dữ liệu thử để xóa tất cả constaints của nó, một cái gì đó như thế này:

domain.Tables["TABLE_NAME"].Constraints.Clear(); 

nên làm việc và sau đó bạn sẽ có thể loại bỏ nó từ tập dữ liệu.

nếu bạn có vấn đề với chế PK mà không thể được gỡ bỏ thử điều này:

 var myTable = domain.Tables["TABLE_NAME"]; 

     for (int i = myTable.Constraints.Count - 1; i >= 0; --i) 
     { 
      if (myTable.Constraints[i] is System.Data.ForeignKeyConstraint) 
      { 
       myTable.Constraints.Remove(myTable.Constraints[i]); 
      } 
     } 
+0

Thật không may, tôi đã thử điều này rồi. Tôi nhận được một ngoại lệ "Không thể loại bỏ ràng buộc duy nhất 'PrimaryKey'. Hủy bỏ ràng buộc khóa ngoài CONSTRAINT_NAME đầu tiên". Đây là cùng một chìa khóa nước ngoài mà cuộc gọi loại bỏ trả về cho tôi. – Steve

+0

Vẫn không thực hiện được, khi tôi cố gắng chèn đoạn mã của bạn trước khi cuộc gọi để xóa và sau khi gọi đến ParentRelations.Clear(), nó chỉ tìm thấy một ràng buộc fk.Không phải là nguyên nhân gây ra sự cố. Điều kỳ lạ nhất của nó. – Steve

+0

Đoán tôi sẽ lặp qua từng bảng trong tập dữ liệu. – Steve

0

trả lời của bạn là đúng Nhưng bảng sẽ không bị xóa từ Dataset .. Tuy nhiên nó vẫn còn nếu người dùng muốn tạo ra một bảng tương tự tên .. sau đó nó sẽ hiển thị Bảng tồn tại ..

if (domain.Tables [ "TABLE_NAME"]! = null) {

for (int f = domain.Tables["TABLE_NAME"].ChildRelations.Count -1; f >=0; f--) 
    { 
     domain.Tables["TABLE_NAME"].ChildRelations[f].ChildTable.Constraints.Remove(domain.Tables["TABLE_NAME"].ChildRelations[f].RelationName); 
     domain.Tables["TABLE_NAME"].ChildRelations.RemoveAt(f); 
    } 
    domain.Tables["TABLE_NAME"].ChildRelations.Clear(); 
    domain.Tables["TABLE_NAME"].ParentRelations.Clear(); 
    domain.Tables["TABLE_NAME"].Constraints.Clear(); 
    domain.Tables.Remove("TABLE_NAME"); 
} 
+0

Tôi không chắc chắn những gì bạn đang nhận được. Bạn có yêu cầu thêm thông tin không? – Steve

1

đây là những gì đã làm việc cho tôi:

DataTable table = dataSet.Tables["TABLE_NAME"]; 
while (table.ChildRelations.Count > 0) 
{ 
    var relation = table.ChildRelations[0]; 
    dataSet.Tables[relation.ChildTable.TableName].Constraints.Remove(relation.RelationName); 
    dataSet.Relations.Remove(relation); 
} 

while (table.ParentRelations.Count > 0) 
{ 
    dataSet.Relations.Remove(table.ParentRelations[0]); 
} 

table.Constraints.Clear(); 

dataSet.Tables.Remove(table); 
table.Dispose(); 
0

Nếu bạn nhận được lỗi Ràng buộc ngoại khóa, Trước tiên hãy xóa bảng con khỏi DataSet và bảng cha.

Kính trọng, Vinay