2011-09-02 9 views
10

Sto tentando di rimuovere un datatable che è stato caricato in un set di dati ed è stato correlato. Ecco il codice che ho tentato.Come rimuovere un datatable da un set di dati (ha una serie di relazioni)

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; 

Questo genera un'eccezione al punto di rimuovere il tavolo, a causa di un vincolo di chiave esterna esistente. Sfortunatamente, il modo in cui la logica è non ho idea di quale sia il nome del vincolo [quindi non posso codificarlo con difficoltà].

È lì per eseguire questa operazione in modo più semplice, oppure posso ottenere alcuni suggerimenti su come individuare e rimuovere il vincolo che sta causando il mio problema.

Grazie in anticipo, Steve

-------------------------- RISPOSTA ---------- --------------

Non mi è stato permesso di rispondere alla mia domanda quindi ecco la soluzione che ho trovato. Questo snippet di codice ora funziona per me. Ho dovuto viaggiare la relazione con l'altro tavolo e rimuovere il vincolo da lì.

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

dominio è un insieme di dati (di tipo System.Data.DataSet) ma sì, i dati sono stati caricati da SQL Server 2005 – Steve

+0

@ Chris sta lavorando in memoria con oggetti ADO.NET, motore di database non è rilevante in questo contesto. –

+0

Ho trovato che non avevo bisogno di fare le tre linee dominio . "TABLE_NAME". ChildRelations.Clear(); domain.Tables ["TABLE_NAME"]. ParentRelations.Clear(); domain.Tables ["TABLE_NAME"]. Constraints.Clear(); –

risposta

5

prima di rimuovere la tabella dal set di dati tenta di cancellare tutti i suoi constaints, qualcosa di simile:

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

dovrebbe funzionare e si dovrebbe quindi essere in grado di rimuoverlo dal set di dati.

se avete la questione con vincolo PK che non può essere rimosso provare questo:

 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

Purtroppo, ho già provato questo. Ricevo un'eccezione "Impossibile rimuovere il vincolo univoco" PrimaryKey ". Rimuovi prima il vincolo di chiave esterna CONSTRAINT_NAME". Questa è la stessa chiave esterna che la chiamata di rimozione restituisce a me. – Steve

+0

Ancora un no go, quando tento di inserire lo snippet prima della chiamata da rimuovere e dopo la chiamata a ParentRelations.Clear() trova solo un vincolo fk.Non quello che sta causando il problema. È la cosa più strana. – Steve

+0

Indovina che ho intenzione di scorrere ogni tabella nel set di dati. – Steve

0

tua risposta è giusto, ma le tabelle non vengono eliminati dal set di dati .. Ancora rimane se l'utente vuole creare una stesso tavolo nome .. poi mostrerà esiste Tabella ..

se (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

Non sono sicuro di cosa stai ricevendo. Stai chiedendo ulteriori informazioni? – Steve

1

Ecco cosa funzionato per me:

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

Se vostro ottenere l'errore ForeignKey vincolo, prima rimuovere le tabelle figlio dal set di dati e quindi tabella padre.

saluti, Vinay

Problemi correlati