【问题标题】:How do I remove a datatable from a dataset (has a bunch of relationships)如何从数据集中删除数据表(有一堆关系)
【发布时间】:2011-09-02 17:20:44
【问题描述】:

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

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;

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

是否可以以更简单的方式完成此任务,或者我能否就如何定位和删除导致我的问题的约束获得一些建议。

提前感谢,史蒂夫

--------------答案------ ----

我不被允许回答我自己的问题,所以这是我想出的解决方案。 这段代码 sn-p 现在对我有用。我不得不将关系移动到另一个表并从那里删除约束。

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

【问题讨论】:

  • 域是一个数据集(System.Data.Dataset 类型)但是是的,数据最初是从 SQL SERVER 2005 加载的
  • @Chris 他正在使用 ADO.NET 对象在内存中工作,数据库引擎与此上下文无关。
  • 我发现我不需要做三行 domain.Tables["TABLE_NAME"].ChildRelations.Clear(); domain.Tables["TABLE_NAME"].ParentRelations.Clear(); domain.Tables["TABLE_NAME"].Constraints.Clear();

标签: .net datatable dataset foreign-keys constraints


【解决方案1】:

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

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

应该可以工作,然后您应该能够将其从数据集中删除。

如果您遇到无法删除的 PK 约束问题,请尝试以下操作:

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

【讨论】:

  • 不幸的是,我已经尝试过了。我得到一个异常“无法删除唯一约束'PrimaryKey'。首先删除外键约束CONSTRAINT_NAME”。这是删除调用返回给我的同一个外键。
  • 仍然不行,当我尝试在调用 remove 之前和调用 ParentRelations.Clear() 之后插入你的 sn-p 时,它只找到一个 fk 约束。不是导致问题的那个。这是最奇怪的事情。
  • 猜猜我要遍历数据集中的每个表。
  • Davide,感谢您的帮助,我找到了解决方案(发布在我的问题中,因为我无法回答自己的问题)。我也不能赞成你的帮助。
【解决方案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】:

    挖坟,不过打到这个,需要删除几个也有子表的表,所以做了一个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);
    }
    

    【讨论】:

      猜你喜欢
      • 2013-03-27
      • 2011-07-26
      • 2015-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-25
      • 2016-11-01
      • 2015-03-05
      相关资源
      最近更新 更多