从C#中删除数据表中的行

时间:2011-06-17 19:37:00

标签: c# datatable

我在从数据表中删除行时遇到问题。在我的程序中,我使用sql查询将数据库中的信息读入数据表。我使用oledb连接和代码dt.Load(command.ExecuteReader());来执行此操作。稍后,我想删除与id字符串匹配的行。我试过以下代码购买无法让它工作:

            DataRow[] drr = dt.Select("Student=' " + id + " ' "); 
            for (int i = 0; i < drr.Length; i++)
                dt.Rows.Remove(drr[i]);
            dt.AcceptChanges();

任何人都可以用一个例子来建议另一种方式吗?

8 个答案:

答案 0 :(得分:17)

尝试使用Delete方法:

    DataRow[] drr = dt.Select("Student=' " + id + " ' "); 
    for (int i = 0; i < drr.Length; i++)
        drr[i].Delete();
    dt.AcceptChanges();

答案 1 :(得分:3)

有几种不同的方法可以做到这一点。但您可以使用以下方法:

List<DataRow> RowsToDelete = new List<DataRow>();

for (int i = 0; i < drr.Length; i++) 
{     
   if(condition to delete the row) 
   {  
       RowsToDelete.Add(drr[i]);     
   } 
}

foreach(var dr in RowsToDelete) 
{     
   drr.Rows.Remove(dr); 
} 

答案 2 :(得分:2)

这个问题将为您提供有关如何从DataTable中删除记录的深入见解:

DataTable, How to conditionally delete rows

看起来像这样:

DataRow[] drr = dt.Select("Student=' " + id + " ' "); 
foreach (var row in drr)
   row.Delete();

不要忘记,如果要更新数据库,则需要调用Update命令。有关详细信息,请参阅此链接:

http://www.codeguru.com/forum/showthread.php?t=471027

答案 3 :(得分:0)

我认为OP代码不起作用的原因是因为一旦你调用Remove你正在改变drr的长度。当您调用Delete时,实际上不会删除该行,直到调用AcceptChanges。这就是为什么如果你想使用Remove你需要一个单独的循环。

视情况或偏好而定......

string colName = "colName";
string comparisonValue = (whatever it is).ToString();
string strFilter = (dtbl.Columns[colName].DataType == typeof(string)) ? "[" + colName + "]='" + comparisonValue + "'" : "[" + colName + "]=" + comparisonValue;
string strSort = "";

DataRow[] drows = dtbl.Select(strFilter, strSort, DataViewRowState.CurrentRows);

以上用于下两个例子

foreach(DataRow drow in drows)
{
   drow.Delete();//Mark a row for deletion.
}
dtbl.AcceptChanges();

OR

foreach(DataRow drow in drows)
{
   dtbl.Rows[dtbl.Rows.IndexOf(drow)].Delete();//Mark a row for deletion.
}
dtbl.AcceptChanges();

OR

List<DataRow> listRowsToDelete = new List<DataRow>();

foreach(DataRow drow in dtbl.Rows)
{
   if(condition to delete)
   {
      listRowsToDelete.Add(drow);
   }
}

foreach(DataRow drowToDelete in listRowsToDelete)
{
   dtbl.Rows.Remove(drowToDelete);// Calling Remove is the same as calling Delete and then calling AcceptChanges
}

请注意,如果调用Delete(),则应调用AcceptChanges(),但如果调用Remove(),则不需要AcceptChanges()。

Also, here is a good link on row filter syntax.

答案 4 :(得分:0)

我使用Remove方法和其他人使用Delete方法查看了许多答案。

删除(根据文档)将立即从(本地)表中删除记录,并且在更新时,不会删除丢失的记录。

比较删除将RowState更改为Deleted,并将更新Update上的服务器表。同样,在更新服务器表之前调用AcceptChanges方法会将所有RowState重置为Unchanged,并且任何内容都不会流向服务器。 (在多次击中之后仍然护理我的拇指)。

答案 5 :(得分:0)

如果您想从 DataTable 中删除整行

试试这个

DataTable dt = new DataTable();  //User DataTable
DataRow[] rows;
rows = dt.Select("Student=' " + id + " ' ");
foreach (DataRow row in rows)
     dt.Rows.Remove(row);

答案 6 :(得分:0)

高级for loop在这种情况下效果更好

public void deleteRow(DataRow selectedRow)
        {
            foreach (DataRow  in StudentTable.Rows)
            {
                if (SR[TableColumn.StudentID.ToString()].ToString() == StudentIndex)
                    SR.Delete();
            }

            StudentTable.AcceptChanges();
        }

答案 7 :(得分:-1)

一个简单的例子:http://www.dotnetspark.com/tutorial/13-42-delete-row-from-datatable.aspx

这对你有用吗?