Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/104: Рейтинг темы: голосов - 104, средняя оценка - 4.94
 Аватар для r@di0
103 / 92 / 20
Регистрация: 24.01.2009
Сообщений: 519

Удаление записей в ADOTable

16.02.2011, 14:52. Показов 21227. Ответов 14

Студворк — интернет-сервис помощи студентам
Доброго времени суток, уважаемые форумчане!
Столкнулся на первый с тривиальной задачей - удалить записи из базы.
Но после часа тщетных попыток мне стало не смешно.
У меня аксесовкая БД. Состоит из одной таблицы, поэтому использую ADOTable.

Я прохожу по всем записям набора в цикле и поэтому сначала пробовал удалять записи прямо в цикле, что было бы мне удобно:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
var
  ActiveState: Boolean;
begin
  with MainForm do
  begin
    ActiveState := ADOTable.Active;
    DBGrid.DataSource.DataSet.DisableControls;
    if not ActiveState then
      ADOTable.Active := True;
    ADOTable.First;
    while not ADOTable.Eof do
    begin
      //...
      if DeleteRecCheck.Checked then
        ADOTable.Delete  //ADOTable.DeleteRecords(arCurrent)
      else
        ADOTable.Next;
    end;
    ADOTable.Active := ActiveState;
    DBGrid.DataSource.DataSet.EnableControls;
  end;
end;
При удалении последней записи возникает ошибка, что достигнут BOF или EOF и нужна последняя запись. Насколько я могу судить, это происходит потому что Delete после удаления записи ставит указатель на следующую запись.
Ладно так не получилось, черт с ним, пробую по-другому:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
var
  ActiveState: Boolean;
begin
  with MainForm do
  begin
    ActiveState := ADOTable.Active;
    DBGrid.DataSource.DataSet.DisableControls;
    if not ActiveState then
      ADOTable.Active := True;
    ADOTable.First;
    while not ADOTable.Eof do
    begin
      //...
      ADOTable.Next;
    end;
    if DeleteRecCheck.Checked then
      if ADOTable.Filtered then
        ADOTable.DeleteRecords(arFiltered)
      else
        ADOTable.DeleteRecords(arAll);
    ADOTable.Active := ActiveState;
    DBGrid.DataSource.DataSet.EnableControls;
  end;
end;
Но и при этом возникает ошибка, что операция невозможна в данном контексте.

Вопрос: Кто-нибудь когда-нибудь удалял записи из ADOTable?

З.Ы. Удаление через sql-запрос ADOQuery не предлагать. Проект довольно громоздкий и переделывать всё под ADOQuery только из-за удаления записей - явно не рационально, да и лень
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.02.2011, 14:52
Ответы с готовыми решениями:

Поиск записей в AdoTable
Здравствуйте ! Я провожу поиск заптсей по зажанным критериям в adotable. Код который показан на изображении работает только до первой...

Учет записей в AdoTable
Доброй ночи! У меня такая проблема, автомат должен следить за количеством загруженых ячеек в ADOtable и если их количество равно 1,...

Сортировка записей AdoTable
Есть Бд Access. Подключение происходит через ADO. Естественно таблицу подключаю к AdoTable. Задача состоит в том что б записи таблицы можно...

14
 Аватар для Splitter
203 / 145 / 16
Регистрация: 13.01.2009
Сообщений: 554
16.02.2011, 15:15
я с таким тоже сталкивался, перерыл весь инет но ничего толкового не нашел, в итоге всетаки перешел на sql
0
Фрилансер
 Аватар для Mad_Dog
452 / 433 / 117
Регистрация: 01.06.2010
Сообщений: 1,314
16.02.2011, 15:44
r@di0, вот такой код в моей программе напрочь удаляет все записи из таблицы без проблем...
Delphi
1
2
3
4
      MainForm.ADOTblAnkets.Filtered:=false;
      MainForm.ADOTblAnkets.First;
      while not MainForm.ADOTblAnkets.Eof do
        MainForm.ADOTblAnkets.Delete;
0
Тимуровец
 Аватар для Страдалецъ
445 / 285 / 50
Регистрация: 10.09.2009
Сообщений: 963
16.02.2011, 16:12
Насколько я помню применять AdoTable1.DeleteRecords надо было при закрытой таблице.
0
1263 / 706 / 62
Регистрация: 21.12.2009
Сообщений: 2,256
16.02.2011, 16:18
Коллеги, а почему Delete from не пользуете с TADOQuery . Это просто, как точило!
0
Фрилансер
 Аватар для Mad_Dog
452 / 433 / 117
Регистрация: 01.06.2010
Сообщений: 1,314
16.02.2011, 16:23
А потому что ТС пишет
З.Ы. Удаление через sql-запрос ADOQuery не предлагать.
0
 Аватар для Splitter
203 / 145 / 16
Регистрация: 13.01.2009
Сообщений: 554
16.02.2011, 16:52
Цитата Сообщение от Mad_Dog Посмотреть сообщение
А потому что ТС пишет
лучше один раз посидеть и сделать хорошо, чем сейчас решить как попало и при дальнейших изменениях вновь и вновь натыкаться на эти грабли
0
1263 / 706 / 62
Регистрация: 21.12.2009
Сообщений: 2,256
16.02.2011, 18:01
Цитата Сообщение от Mad_Dog Посмотреть сообщение
А потому что ТС пишет
Понятно, религия не позволяет!
0
 Аватар для r@di0
103 / 92 / 20
Регистрация: 24.01.2009
Сообщений: 519
17.02.2011, 17:22  [ТС]
Цитата Сообщение от Mad_Dog Посмотреть сообщение
r@di0, вот такой код в моей программе напрочь удаляет все записи из таблицы без проблем...
Delphi
1
2
3
4
      MainForm.ADOTblAnkets.Filtered:=false;
      MainForm.ADOTblAnkets.First;
      while not MainForm.ADOTblAnkets.Eof do
        MainForm.ADOTblAnkets.Delete;
Такой подход не подходит, поскольку применим только к нефильтрованным записям.
Цитата Сообщение от Страдалецъ Посмотреть сообщение
Насколько я помню применять AdoTable1.DeleteRecords надо было при закрытой таблице.
Нет.
Цитата Сообщение от Splitter Посмотреть сообщение
лучше один раз посидеть и сделать хорошо, чем сейчас решить как попало и при дальнейших изменениях вновь и вновь натыкаться на эти грабли
А почему Вы думаете, что у меня плохо и как попало?
Цитата Сообщение от SAMZ Посмотреть сообщение
Понятно, религия не позволяет!
Когда таблица одна, то мне вполне удобно работать через ADOTable. И переделывать весь проект при первой сложности - не айс.
Такие вещи меня никогда не вдохновляли.

Вопрос решен:
Поскольку удаление любым способом сводится к процедуре DoRecordsetDelete из модуля ADODB,
то такая правка процедуры решает проблему:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
procedure DoRecordsetDelete(DataSet: TCustomADODataSet; AffectRecords: TAffectRecords);
begin
  with DataSet do
  try
    Recordset.Delete(AffectRecordsValues[AffectRecords]);
    if (CacheSize > 1) and (PRecInfo(ActiveBuffer).RecordNumber <> 1) then
    begin
      Recordset.MovePrevious;
      Recordset.MoveNext;
    end;
    if Recordset.RecordCount > 0 then //здесь тупо вводим дополнительную проверку
      Recordset.MoveNext;
  except
    on E: Exception do
    begin
      Recordset.CancelUpdate;
      DatabaseError(E.Message);
    end;
  end;
end;
Добавлено через 5 минут
Чтобы использовать измененный модуль, можно подложить его в папку с проектом.
0
1263 / 706 / 62
Регистрация: 21.12.2009
Сообщений: 2,256
17.02.2011, 17:29
r@di0,
то мне вполне удобно работать через ADOTable. И переделывать весь проект при первой сложности - не айс.
1. Понятие "удобно" весьма условно. Использование циклов при работе с БД - верный признак недостатка в консерватории.
2. О какой сложности и какой переделке идет речь. Добавить ровно одну компоненту, прописать в нем удаление одной строкой, исполнить и отрефрешить рабочий набор - это, что сложная переделка!
3. При работе с SQL при решении каких - либо частных задач первое, о чем следует думать, можно ли эту задачу решить средствами SQL. Если нет, то еще раз подумать, в вдруг можно!
0
 Аватар для r@di0
103 / 92 / 20
Регистрация: 24.01.2009
Сообщений: 519
17.02.2011, 17:52  [ТС]
Что понятие "удобно" условно - не спорю. В данном случае, конкретно мне - удобно.
Что касается циклов - несколько голословно. Если мне нужно пройти по всем записям, почему я не могу использовать цикл?
А с вводом дополнительного компонента - готов поспорить. Зачем мне вводить еще один компонент, если я уже использую ADOTable и у него есть средства для реализации того, что мне нужно? Если Вы имели в виду полностью заменить ADOTable на ADOQuery, то этот вариант в данном случае меня не устраивает. Пришлось бы всю работу с БД переделывать под этот компонент, а это довольно муторно - в проекте больше десятка модулей.
Что касается этого:
Цитата Сообщение от SAMZ Посмотреть сообщение
При работе с SQL при решении каких - либо частных задач первое, о чем следует думать, можно ли эту задачу решить средствами SQL. Если нет, то еще раз подумать, в вдруг можно!
Может Вы и правы.
0
 Аватар для Splitter
203 / 145 / 16
Регистрация: 13.01.2009
Сообщений: 554
17.02.2011, 17:58
Цитата Сообщение от r@di0 Посмотреть сообщение
Что касается циклов - несколько голословно. Если мне нужно пройти по всем записям, почему я не могу использовать цикл?
lавайте проведем смелый эксперимент, возьмем таблицу с 1000 записями и удалим эти записи sql запросом и циклом, потом сравним время и перегнанный трафик, трафик, думаю Вас удивит особо
0
 Аватар для r@di0
103 / 92 / 20
Регистрация: 24.01.2009
Сообщений: 519
17.02.2011, 18:09  [ТС]
В цикле я прохожу не затем, чтобы удалить каждую запись, а потому что мне нужно взять данные каждой записи и отправить эти данные отдельным сообщением. И если стоит флаг, что необходимо удалять отправленные записи - я сразу удаляю отправленную запись.
Я же не буду выкладывать здесь весь код. Поэтому я оставил только тот, который непосредственно касается моего вопроса.
И вообще, господа, Вам не кажется, что мы отошли от темы моего вопроса?
И это не смотря на то, что я изначально подчеркнул, что тему ADOQuery и SQL не затрагивать.
0
0 / 0 / 0
Регистрация: 06.04.2011
Сообщений: 83
07.10.2011, 16:46
r@di0
ничто не мешает на основе того же ADOQuery создать цикл по сути это тот же ADOTable
(правда ошибка будет так же что и в ADOTable) только адресация прописывается в ручную что весьма удобно при случаях подобных вашему.

есть два решения вашей проблемы
решение первое вы и дальше можете убивать свой мозг а можете
обработать данные по тому же циклу не обрабатывая полей назначенных на удаление
а после этого с помощью все того же ADOQuery удалить нужные вам поля
для подобных манипуляций вам не нужно ставить для каждой таблицы ADOQuery достаточно одного (так как адрес таблицы в ADOQuery можно переписывать бесконечное множество раз "только не надо делать на него конкретных ссылок в программе этот компонент годен только для одноразового использования ") можно даже лишенного конкретной адресации только не забудьте DataSours для него
почему вас упорно посылают к данному компоненту, да потому что через него легче всего обратиться к каким-то конкретным данным при этом ничего не удаляя или не изменяя, вам никто не мешает использовать ADOQuery и ADOTable одновременно

второй вариант но это уже сложно! подобная задача не редкость и её аналог реализован в 1С
если у вас хватит настырности разворошить системный код конфигурации 1С тогда желаю удачи(системный потому что там любое удаление построено по методу описанному вами "сначала пометка на удаление, а потом само удаление помеченных полей")

P.S.
ADOQuery
предназначен для работы с конкретными ячейками БД и плох для работы со всей БД когда нужно обработать каждую запись
ADOTable
предназначен для обработки всей БД, выбрать из всей БД конкретные данные возможно а вот редактирование данных либо слишком сложно либо вообще невозможно без появления ошибок.(как в данном случае)
0
 Аватар для r@di0
103 / 92 / 20
Регистрация: 24.01.2009
Сообщений: 519
09.10.2011, 11:38  [ТС]
magistrmediv, тема не актуальна. Вопрос уже решен.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.10.2011, 11:38
Помогаю со студенческими работами здесь

добавление записей в цикле из edit (adotable, access)
Здравствуйте! Есть форма для ввода пользователем учебных предметов. Сначала пользователь вводит кол-во предметов( например 3). Появляется...

Как проверить, что в AdoTable меньше 12-ти записей?
Помогите пожалуйста, как написать условие: если в adotable меньше 12 записей то сделать...

Удаление текущей записи ADOTable...
Доброго всем времени суток! Есть база данных Access, подключаюсь, через ADOconection и привязываю к базе ADOTable. Для отображения данных...

Команда через adoconnection или adotable для удаления всех записей из БД
какой командой через adoconection или adotable можно удалить все записи в БД при нажатии на кнопку button

Удаление записей в AdoTable
Всем здравствуйте. Есть привязанная БД ACESS через AdoConnection + AdoTable. Мне нужно удалять от туда записи, которые можно выбирать через...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru