2011-03-29 39 views
0

我有一个table1,我想从table2中删除数据行。我试图环通的数据,并相应地删除...如何基于另一个表删除一个表中的一行?

while (myDataReader.Read()) 
{   
    DataTable.Rows.Remove(DataRow); 
} 

没有运气,我也尝试过两个表已填充

var correctDataTable = from p in DataTable 
         where (!tempDataTable.Rows.Contains(p)) 
         select new { p }; 

任何想法后删除?在你的数据库上

DataTable.Rows.Remove(DataRow); 

+0

你使用任何数据访问方法吗?像实体框架,Linq to sql或NHibarate。你也没有用你的代码去除数据。您正尝试删除整行。 – tugberk 2011-03-29 17:29:48

+0

这实际上是我想删除...对不起 – MrM 2011-03-29 17:41:47

+0

稍等片刻,你是在谈论数据库中的表或数据集中的表? – Doliveras 2011-03-29 18:04:00

回答

2

我会写一个查询做这一切在一个声明中

delete from TableA 
where ColID in (select colid from tableB) 
+0

不是linq,但是又快又简单:-D – Doliveras 2011-03-29 17:41:40

+0

我不认为我可以在cs文件上做到这一点...... – MrM 2011-03-29 17:44:49

+0

如果您使用的是数据库,则可以使用sqlCommand轻松执行此语句或OleDBCommand对象 – Doliveras 2011-03-29 18:02:52

0

保持实际上不会删除数据,假设这是你想要的。 这样您只能从您的数据表对象中的行集合中删除行。

下一步是实际提交对数据库的更改。再次,假设这是你正在寻找的。

0

你是什么意思删除?你能指出一点更好的你想要什么? 要从表格中删除整行,还是只删除一个单元格? - 基于什么? 你的第一篇文章很不清楚。

所以你有两张桌子。第一个有所有的数据,第二个有一些。如果来自table2的任何数据存在于table1中,则必须删除表1中的这些数据?我对吗?

您可以通过这两个表(所以双回路)的行中循环:

foreach (DataRow dr1 in table1.Rows) 
     { 
      foreach (DataRow dr2 in table2.Rows) 
      { 
       if (dr1[0].ToString() == dr2[0].ToString()) 
       { 
        table1.Rows.Remove(dr1); 
        break; 
       } 
      } 
     } 
+0

我期待从table2(所有数据)中删除table1(某些数据)中的行。对于混淆感到抱歉 – MrM 2011-03-29 17:46:40

0

我想通了。我将以下内容添加到table2的table while循环中(表中的行将被删除)。

while (myDataReader.Read()) 
{ 
    DataRow drNew = DataTable.NewRow(); 
    drNew["ID"] = myDataReader["ID#"].ToString().Trim(); 
    drNew["Name"] = myDataReader["NAME"].ToString().Trim()); 
    ... 
    DataRow[] badRow = DataTable.Select(
      "ID='" + drNew["ID"] + "' and Name='" + drNew["Name"] + "'"); 
    if(badRow.Length >0) 
     DataTable.Rows.Remove(badRow[0]); 
} 
0

如果你想要的是删除使用存储在另一个数据表中的键可以重复表与键从数据表中的某些行,找到要删除的...做表的关键。

实施例:

考虑TABLE2与(table1ID,COL2,COL3,COL4)柱和用TABLE1(ID,COL2,COL3)列。 你可以这样做:

foreach (TABLE2row t2r in TABLE2) 
{ 
    t1r=TABLE1.FindByID(t2r.Table1ID); 
    if (t1r!=null) 
    { 
     t1r.delete(); 
    } 
} 

这是考虑到您使用的主键类型化数据集。

0

从dtCMATM表中删除不在dtAllowedList表中的所有记录。

 private void GetProperData() 
    { 
     DataTable dtAllowedList = someclass.somefunctiontogetdata(....); 
     DataTable dtCMATM = someclass.somefunctiontogetdataTobeRemovedLaterOn(.........); 
     DataTable tblCloned = new DataTable(); 
     tblCloned = dtCMATM.Clone(); 

     foreach (DataRow dr2 in dtAllowedList.Rows) 
     { 
     DeleteRowsFromDataTable(ref tblCloned, dtCMATM, "AssignTo", dr2[0].ToString()); 
     } 

     tblCloned.AcceptChanges(); 
     dtCMATM = tblCloned; 
     dtCMATM.AcceptChanges();  

    } 

    private static void DeleteRowsFromDataTable(ref DataTable tblCloned, DataTable dtCMATM, string ColumnName, string columnValue) 
    {   
     string strExpression = "AssignTo = '" + columnValue + "' "; 
     dtCMATM.DefaultView.RowFilter = strExpression; 
     dtCMATM = dtCMATM.DefaultView.ToTable(); 

     if (dtCMATM.Rows.Count > 0) 
     { 
      tblCloned.ImportRow(dtCMATM.Rows[0]); 
     }   
    }  
相关问题