Удаление рядов(строк) в DataTable: фича или баг?
От: kva-kva  
Дата: 10.12.03 09:58
Оценка:
Имеем DataTable, заполняемый из БД.
Задача: удалить все ряды из ДТ, чтоб в базе тоже удалились.

Решение 1(вроде бы самое простое и очевидное):

dt.Rows.Clear();


Решение 2:

while(dt.Rows.Count != 0)
{
    dt.Rows.Remove(dt.Rows[0]); 
}


Решение 3:

while(dt.Rows.Count != 0)
{
    dt.Rows[0].Delete();
// и как сказано здесь: ms-help://MS.VSCC/MS.MSDNVS/cpguide/html/cpcondeletingdatarowfromdatatable.htm
    dt.AcceptChanges(); 
}


после всех этих попыток удаления ессно делали Апдейт тейбла и рефиллинг.
Ни 1 способ не сработал!!!

в рез-те долгих копаний коллега по работе нашел-таки способ:

foreach(DataRow dtRow in dt.Rows)
{
    dtRow.Delete();
}


и НЕ ВЫЗЫВАТЬ AcceptChanges(), иначе опять не удаляется!!!

кто-нить может объяснить сей фак(т)?
говорят, что вроде в дотнете 2003(мы сидим пока на 2002) эта фича исправлена...
Re: Удаление рядов(строк) в DataTable: фича или баг?
От: Аноним  
Дата: 10.12.03 10:20
Оценка:
Здравствуйте, kva-kva, Вы писали:

читай MSDN

KK>Решение 1(вроде бы самое простое и очевидное):

KK>
KK>dt.Rows.Clear();
KK>

неверно, удаляешь из коллекции (состояние DataRowState=Detached)

KK>
KK>while(dt.Rows.Count != 0)
KK>{
KK>    dt.Rows.Remove(dt.Rows[0]); 
KK>}
KK>

тоже самое, только кусками

KK>
KK>foreach(DataRow dtRow in dt.Rows)
KK>{
KK>    dtRow.Delete();
KK>}
KK>

вот это и есть правильное решение (DataRowState=Deleted)

KK>и НЕ ВЫЗЫВАТЬ AcceptChanges(), иначе опять не удаляется!!!

именно для этого AcceptChanges и придуман

Update исправляет в БД записи с DataRowState Added, Deleted и Modified
AcceptChanges для таблицы приводит в состояние, когда все строки становятся Unchanged

и еще раз — читай MSDN
Re: Удаление рядов(строк) в DataTable: фича или баг?
От: Demoniada Россия  
Дата: 10.12.03 11:21
Оценка:
"kva-kva" <forum@rsdn.ru> wrote in message news:473680@news.rsdn.ru...
> Имеем DataTable, заполняемый из БД.
> Задача: удалить все ряды из ДТ, чтоб в базе тоже удалились.
>
> Решение 1(вроде бы самое простое и очевидное):
>
>
> dt.Rows.Clear();
>

>
> Решение 2:
>
>
> while(dt.Rows.Count != 0)
> {
> dt.Rows.Remove(dt.Rows[0]); 
> }
>

>
> Решение 3:
>
>
> while(dt.Rows.Count != 0)
> {
> dt.Rows[0].Delete();
> // и как сказано здесь: ms-help://MS.VSCC/MS.MSDNVS/cpguide/html/cpcondeletingdatarowfromdatatable.htm
> dt.AcceptChanges(); 
> }
>

>
> после всех этих попыток удаления ессно делали Апдейт тейбла и рефиллинг.
> Ни 1 способ не сработал!!!
>
> в рез-те долгих копаний коллега по работе нашел-таки способ:
>
>
> foreach(DataRow dtRow in dt.Rows)
> {
> dtRow.Delete();
> }
>

>
> и НЕ ВЫЗЫВАТЬ AcceptChanges(), иначе опять не удаляется!!!
>
> кто-нить может объяснить сей фак(т)?
> говорят, что вроде в дотнете 2003(мы сидим пока на 2002) эта фича исправлена...

ага, конечно! И ADO.NET в 1.1 тоже нету
Это друг мой не баг, а фича. Если ты вызываешь метод AcceptChanges, то констатируешь, что данные в Table/DataSet актуальны и не являются модифицированными. Естественно, иные методы кроме работающего просто удаляют строку из Table (точнее, из ее коллекции Rows), а не помечают ее как удаленную, то есть ты лишаешь ADO шанса идентифицировать строку для удаления в БД.
Итого, как правильно сказал коллега, RTFM (то есть читай MSDN) внимательнее. Могу посоветовать для расширения кругозора в этой области Microsoft ADO.NET некоего Сцеппа: классная книжка, понятно написана и все такое.
Posted via RSDN NNTP Server 1.7 "Bedlam"
Да хранит вас господь в сухом прохладном месте...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.