如何根据另一个表删除一个表中的行?

时间:2011-03-29 17:17:49

标签: c# .net linq

我有一个带有数据行的table1,我想从table2中删除它。我试图循环数据并相应删除...

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

没有运气,我也试图在两个表填充后删除

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

有什么想法吗?

6 个答案:

答案 0 :(得分:2)

我会写一个查询来在一个语句中完成所有操作

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

答案 1 :(得分:0)

坚持

 DataTable.Rows.Remove(DataRow); 

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

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

答案 2 :(得分:0)

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

所以你有两张桌子。第一个有所有数据,第二个有一些。如果table1中存在table2中的任何数据,那么必须删除表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;
                }
            }
        }

答案 3 :(得分:0)

我明白了。我将以下内容添加到table2的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]);
}

答案 4 :(得分:0)

如果您想要使用存储在另一个dataTable中的密钥从dataTable中删除某些行,您可以使用密钥对表进行迭代,找到要删除的表中的密钥并完成...

示例:

将TABLE2与(table1ID,col2,col3,col4)列和TABLE1与(id,col2,col3)列一起考虑。 你可以这样做:

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

这是考虑您使用带主键的Typed数据集。

答案 5 :(得分: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]);
        }           
    }