2011-09-02 13 views
10

Próbuję usunąć datatable, które zostały załadowane do zestawu danych i zostały powiązane. Oto kod, który próbowałem.Jak usunąć datatable z zestawu danych (ma kilka relacji)

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; 

Spowoduje to zgłoszenie wyjątku w momencie usuwania tabeli z powodu istniejącego ograniczenia klucza obcego. Niestety, tak jak logika, nie mam pojęcia, jak nazywa się to ograniczenie [więc nie mogę tego zakodować na sztywno].

Czy można to zrobić w łatwiejszy sposób, lub mogę uzyskać sugestie, jak zlokalizować i usunąć ograniczenie, które jest przyczyną mojego problemu.

góry dzięki, Steve

-------------------------- ODPOWIEDŹ ---------- --------------

Nie pozwolono mi odpowiedzieć na własne pytanie, więc tutaj jest rozwiązanie, które wymyśliłem. Ten fragment kodu działa teraz dla mnie. Musiałem przenieść relację do drugiej tabeli i usunąć z niej ograniczenie.

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

domeny to zestaw danych (typu System.Data.DataSet), ale tak, że dane zostały pierwotnie załadowane z SQL Server 2005 – Steve

+0

@Chris Pracuje w pamięci z obiektów ADO.NET, silnik bazy danych nie ma znaczenia w tym kontekście. –

+0

Zauważyłem, że nie muszę wykonywać trzech linii: domain.Tables ["TABLE_NAME"]. ChildRelations.Clear(); domain.Tables ["TABLE_NAME"]. ParentRelations.Clear(); domain.Tables ["TABLE_NAME"]. Constraints.Clear(); –

Odpowiedz

5

przed usunąć tabelę z zestawu danych spróbować wyczyścić wszystkie swoje constaints, coś takiego:

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

powinien działać i powinieneś być w stanie usunąć go ze zbioru danych.

jeśli masz problem z PK Wiązanie, które nie mogą być usunięte spróbuj tego:

 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

Niestety, próbowałem już tego. Pojawia się wyjątek "Nie można usunąć ograniczenia unikalnego" PrimaryKey ". Najpierw usuń ograniczenie klucza obcego CONSTRAINT_NAME". Jest to ten sam klucz obcy, który wywołanie usunięcia zwraca do mnie. – Steve

+0

Wciąż nie ma wyjścia, kiedy próbuję wstawić swój fragment przed wywołaniem, aby usunąć i po wywołaniu ParentRelations.Clear() znajdzie tylko jedno ograniczenie fk.Nie ten, który powoduje problem. To najdziwniejsza rzecz. – Steve

+0

Zgadnij, zamierzam iterować przez każdą tabelę w zestawie danych. – Steve

0

odpowiedź jest prawda Ale tabele nie są usuwane z zestawu danych .. Wciąż pozostaje, jeśli użytkownik chce utworzyć samej tabeli wymienić .. to będzie tabeli wskazują, istnieje ..

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

Nie jestem pewien, do czego zmierzasz. Czy potrzebujesz dodatkowych informacji? – Steve

1

Oto co pracował dla mnie:

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

Jeśli dostajesz błąd ForeignKey ograniczeń, najpierw usuń tabel podrzędnych z zestawu danych, a następnie tabelę nadrzędną.

Pozdrawiam, Vinay

Powiązane problemy