Удаление строки из datatable в C#

у меня проблема с удалением строк из datatable. В моей программе я читаю информацию из базы данных в datatable с помощью sql-запроса. Я использую соединение oledb и код dt.Load(command.ExecuteReader()); для этого. Позже я хочу удалить строки, соответствующие строке id. Я пробовал следующий код buy не могу заставить его работать:

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

может ли кто-нибудь предложить другой способ с примером?

8 ответов


попробуйте использовать удалить способ:

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

Существует несколько разных способов сделать это. Но вы можете использовать следующий подход:

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

этот вопрос даст вам хорошее представление о том, как удалить запись из DataTable:

DataTable, как условно удалить строки

Это будет выглядеть так:

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

Не забывайте, что если вы хотите обновить свою базу данных,вам нужно будет вызвать команду Update. Для получения дополнительной информации об этом см. Эту ссылку:

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


Я думаю, что причина, по которой код OPs не работает, заключается в том, что после вызова 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();

или

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

или

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 () не требуется.

кроме того, вот хорошая ссылка на синтаксис фильтра строк.


Я вижу несколько ответов, используя метод Remove и другие, используя метод Delete.

Remove (согласно документам) немедленно удалит запись из (локальной) таблицы, а при обновлении не удалит отсутствующую запись.

Delete в сравнении изменяет состояние строки на Deleted и обновит таблицу сервера при обновлении. Аналогично, вызов метода AcceptChanges перед обновлением таблицы сервера приведет к сбросу всех ваших RowState(S) в неизмененном виде и ничего не будет поступать на сервер. (Все еще потирая мой большой палец после того, как ударил это несколько раз).


Если вы хотите удалить строку С DataTable ,

попробуй такое

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

заранее for loop работает лучше для этого дела

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

            StudentTable.AcceptChanges();
        }

простой пример : http://www.dotnetspark.com/tutorial/13-42-delete-row-from-datatable.aspx

это работает для вас?