如何从数据集中删除数据表(具有一堆关系)

时间:2011-09-02 17:20:45

标签: .net datatable dataset foreign-keys constraints

我正在尝试删除加载到数据集中的数据表,并且已经相关。 这是我尝试的代码。

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;

由于存在外键约束,因此在删除表时抛出异常。不幸的是,逻辑的方式我不知道约束的名称是什么[所以我不能硬编码]。

是否可以通过更轻松的方式完成此操作,或者我可以获得有关如何查找和删除导致我的问题的约束的一些建议。

先谢谢,史蒂夫

-------------------------- ANSWER -------------------- ----

我不被允许回答我自己的问题所以这里是我提出的解决方案。 此代码段现在适用于我。我必须将关系传递到另一个表并从那里删除约束。

    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 个答案:

答案 0 :(得分:5)

在从数据集中删除表之前,请尝试清除其所有的constaints,如下所示:

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 :(得分:1)

这对我有用:

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

答案 2 :(得分:0)

您的答案是正确的但是表格不会从数据集中删除..如果用户想要创建相同的表名,它仍然存在..那么它将显示表存在..

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

答案 3 :(得分:0)

如果您收到ForeignKey Constraint错误,请首先从DataSet中删除子表,然后从父表中删除。

此致 维奈

答案 4 :(得分:0)

进行深度挖掘,但只需单击此键,就需要删除也有子表的几个表,因此准备了一个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);
}