Имеем 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) эта фича исправлена...
Здравствуйте, 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
"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"