2011-06-17 10 views
9

Mam problem z usuwaniem wierszy z datatable. W moim programie odczytuję informacje z bazy danych w datatable za pomocą zapytania sql. Używam do tego celu połączenia OLEDB i kodu dt.Load(command.ExecuteReader());. Później chcę usunąć wiersze pasujące do ciągu id. Próbowałem następujący kod kupić nie może dostać go do pracy:Usuwanie wiersza z datatable w C#

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

Czy ktoś może zaproponować inny sposób z przykładem?

+0

jakieś komunikaty o błędach? – adt

+0

brak błędów. próbowałem robić drukowanie liczby wierszy w tabeli. jest taki sam przed i po metodzie usuwania powyżej – Norman

Odpowiedz

16

Spróbuj użyć Delete metody:

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

pokonaj mnie! +1 –

+0

nie działa. liczba wierszy jest ponownie taka sama przed i po. Mam widok datagrid wyświetlający tabelę. pozostaje niezmieniony – Norman

+0

Czy twój 'dt.Select (" Student ... 'zwraca wyniki (nie pusta tablica)? – manji

2

To pytanie daje dobre wgląd w jaki sposób usunąć rekord z DataTable:

DataTable, How to conditionally delete rows

to będzie wyglądać następująco:

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

Nie zapomnij, że jeśli chcesz zaktualizować bazę danych, będziesz musiał zadzwonić do polecenia Aktualizacji. Aby uzyskać więcej informacji na ten temat można znaleźć w ten link:

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

3
Nie

kilka różnych sposobów, aby to zrobić. Ale Możesz użyć następującego podejścia:

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

Cześć bracie, Jak wprowadziłeś RowsToDelete? Jest tutaj? DataRow [] RowsToDelete = zero; – Brian

0

Myślę, że powodem, dla którego kod OPs nie działa, jest to, że po wywołaniu Usuń zmieniasz Długość drr. Kiedy wywołasz Delete, nie usuniesz wiersza, dopóki nie zostanie wywołany AcceptChanges. Dlatego jeśli chcesz użyć Remove, potrzebujesz osobnej pętli.

zależności od sytuacji i preferencji ...

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

używane dla następnych dwóch przykładach

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

LUB

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

LUB

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 
} 

Zauważ, że jeśli wywołasz Delete(), powinieneś zadzwonić AcceptChanges(), ale jeśli wywołasz Remove(), to AcceptChanges() nie jest konieczne.

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

0

widzę liczbę odpowiedzi z wykorzystaniem metody usunąć i innych wykorzystujących metodę Delete.

Usuń (zgodnie z dokumentami) natychmiast usunie rekord z tabeli (lokalnej), a po aktualizacji nie usunie brakującego rekordu.

Usunięcie przy porównaniu zmienia stan RowState na Deleted i aktualizuje tabelę serwerów w Update. Podobnie wywołanie metody AcceptChanges przed aktualizacją do tabeli serwerów spowoduje zresetowanie wszystkich twoich danych RowState do niezmienionej i nic nie wpłynie na serwer. (Ciągle pielęgnuję kciuk po kilkukrotnym uderzeniu).

0

Jeśli chcesz usunąć cały wiersz z DataTable,

spróbować to

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