Как удалить данные из набора данных (имеет кучу взаимосвязей)

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

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

Ответ 1

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

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

Ответ 2

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

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();

Ответ 3

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

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

Ответ 4

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

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