Как удалить набор данных из набора данных (имеет несколько связей) - PullRequest
10 голосов
/ 02 сентября 2011

Я пытаюсь удалить таблицу данных, которая была загружена в набор данных и была связана.Вот код, который я пытался выполнить.

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;

Это вызывает исключение в момент удаления таблицы из-за существующего ограничения внешнего ключа.К сожалению, логика такова, что я понятия не имею, как называется ограничение [поэтому я не могу его жестко запрограммировать].

Есть ли возможность выполнить это более простым способом, или я могу получить некоторые предложенияо том, как найти и удалить ограничение, которое вызывает мою проблему.

Заранее спасибо, Стив

-------------------------- ОТВЕТ ------------------------

Мне не разрешили ответить на мой собственный вопрос, таквот решение, которое я придумал.Этот фрагмент кода теперь работает для меня.Мне пришлось перенести отношение на другую таблицу и удалить оттуда ограничение.

    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"); 
    }

Ответы [ 5 ]

5 голосов
/ 02 сентября 2011

перед тем, как удалить таблицу из набора данных, попытайтесь очистить все ее константы, примерно так:

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

должно работать, и вы сможете удалить его из набора данных.

если у вас есть проблема с PK Constraint, которую нельзя удалить, попробуйте следующее:

        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]);
            }
        }
1 голос
/ 09 февраля 2015

Вот что у меня сработало:

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 голосов
/ 12 июля 2018

Могильное копание, но просто нажмите это и нужно удалить несколько таблиц, которые также имели дочерние таблицы, поэтому приготовили метод расширения DataSet:

public static void RemoveTable(this DataSet dataSet, string tableName)
{
    if (!dataSet.Tables.Contains(tableName))
    {
        throw new ArgumentException($"Table {tableName} doesn't exist in DataSet");
    }
    var relations = new DataRelation[dataSet.Tables[tableName].ChildRelations.Count];
    dataSet.Tables[tableName].ChildRelations.CopyTo(relations, 0);
    foreach (DataRelation relation in relations)
    {
        RemoveTable(dataSet, relation.ChildTable.TableName);
    }
    dataSet.Tables[tableName].ChildRelations.Clear();
    dataSet.Tables[tableName].ParentRelations.Clear();
    dataSet.Tables[tableName].Constraints.Clear();
    dataSet.Tables.Remove(tableName);
}
0 голосов
/ 08 апреля 2015

Если вы получаете сообщение об ошибке ForeignKey Constraint, сначала удалите дочерние таблицы из DataSet, а затем родительскую таблицу.

С уважением, Вини

0 голосов
/ 06 апреля 2013

Ваш ответ правильный, но таблицы не удаляются из набора данных. Тем не менее, если пользователь захочет создать такое же имя таблицы, он останется. Тогда будет показано, что таблица существует.

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"); 
}
...