2011-09-02 63 views
10

我正试图删除已加载到数据集中的数据表,并且这些数据表已关联。 这是我尝试的代码。如何从数据集中删除数据表(有一堆关系)

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

域名(类型System.Data.DataSet中)的数据集,但肯定的,数据最初是从SQL Server 2005 – Steve

+0

@克里斯,他是工作在内存与ADO.NET对象加载,数据库引擎在这种情况下不相关。 –

+0

我发现我并不需要做三行 domain.Tables [“TABLE_NAME”]。ChildRelations.Clear(); domain.Tables [“TABLE_NAME”]。ParentRelations.Clear(); domain.Tables [“TABLE_NAME”]。Constraints.Clear(); – 2012-02-28 05:13:14

回答

5

您从数据集表之前试图清除其所有constaints,这样的事情:

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

不幸的是,我已经试过了。我收到一个异常“无法删除唯一约束'PrimaryKey'。首先删除外键约束CONSTRAINT_NAME”。这是删除调用返回给我的外键。 – Steve

+0

仍然没有去,当我试图插入你的片段之前调用删除和调用ParentRelations.Clear()后,它只发现一个fk约束。不是造成问题的原因。它是最奇怪的事情。 – Steve

+0

猜猜我要遍历数据集中的每个表。 – Steve

0

你的答案是正确的,但表不从数据集删除..不过,如果用户想要创建一个相同的表仍然名字..然后它会显示表中存在..

如果(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

我不知道你在得到什么。你是否要求提供更多信息? – Steve

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

如果得到ForeignKey的约束错误,首先要从DataSet中的子表,然后父表。

问候, 维奈

相关问题