| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Базы данных и репортинг > SQL в ADO |
| Автор: Heathen 13.11.2002, 20:55 |
| Здравствуйте ! У меня такой вопрос: Есть таблица Ассеss, первое поле ключевое id_n. Как грамотно удалить/вставить строку? ADODataset1.Commandtext:=('delete from table1 where id_n') - пишет что нехватает параметров, если ... where id_n=5' тогда 5-я строка удаляется но вылетает ошибка: CommandText das not return a result set . Вообще надо конечно выбранную удалять а не 5-ю. Заранее спасибо ! |
| Автор: Heathen 13.11.2002, 21:02 |
| Да, забыл сказать что поле id_n еще и автоинкрементное |
| Автор: Heathen 13.11.2002, 21:56 |
| Вот как я делал это через BDE UpdateSQL1.Query[ukDelete].ParamByName('OLD_id_n').Value:=Query1.FieldByName('id_n').Value; UpdateSQL1.ExecSQL(ukDelete); В UpdateSQL: delete from table1 where id_n = :OLD_id_n В ADO так неполуается т.к. нет в ADO компонента UpdateSQL |
| Автор: Heathen 13.11.2002, 22:05 |
| Даа... то ли никто не знает(что очень сомнительно) то ли я ерунду спрашиваю(признавать это нехочется) |
| Автор: Vit 13.11.2002, 23:05 | ||||
Можно и проще:
|
| Автор: Vit 13.11.2002, 23:07 |
| Sorry, я несколько не понял что такое "Выбранную" - кем выбранную и по какому критерию? Или у тебя уже открытая таблица и там курсор стоит на записи - тогда проще: ADOTable.delete; |
| Автор: Heathen 13.11.2002, 23:13 |
| Ну да-курсор уже стоит на записи (строка выделена). Интересно, а можно все таки это сделать через ADODataset(ну просто чтоб Query на форму не кидать лишний раз) |
| Автор: Vit 13.11.2002, 23:22 |
| Открываем help по ADODataSet, и что мы видим: ... TADODataSet is not capable of issuing Data Manipulation Language (DML) SQL statements that do not return result sets (like DELETE, INSERT, and UPDATE). For this use a component like TADOCommand or TADOQuery. ... Надеюсь это похоже на тот ответ который ты ожидал? |
| Автор: Heathen 13.11.2002, 23:23 |
| ADOTable- не подходит, он ведь в отличии от Query работает c одной таблицей, так? |
| Автор: Vit 13.11.2002, 23:24 |
| Наверно можно извратится и перехватывать сообщения об ошибках, но зачем. И вообще почему используется TADODataSet? Используй изначально вместо него TADOQuery и не будет проблем |
| Автор: Vit 13.11.2002, 23:25 | ||
Да! |
| Автор: Heathen 13.11.2002, 23:25 |
| Сорри, пока писал про ADOTable вы уже ответили про ADODataset |
| Автор: Heathen 13.11.2002, 23:28 |
| Чтоб подвести итог. Как же все таки через Query выделенную строку удалять (а не 5-ю) |
| Автор: Vit 13.11.2002, 23:57 |
| ADOQuery1.delete; Только это не всегда будет работать, если квери типа Select * From MyTable Это будет работать, а если сложный Join какой-нибудь, то это может быть невозможно. |
| Автор: Heathen 14.11.2002, 00:14 |
| Именно Select * From MyTable у меня и прописан но удаляет только в Grid-e (т.е. наверно в НД) а в самой базе все без изменений |
| Автор: Vit 14.11.2002, 00:21 |
| Не знаю, ты чтоли выходишь из программы по TerminateProcess? что она не успевает сбросить кэш... Должно всё работать. |
| Автор: Vit 14.11.2002, 00:23 |
| AdoQuery1.sql.text:='select * from mytable'; AdoQuery1.active:=true; .... AdoQuery1.delete; ......... AdoQuery1.active:=false; Должно работать. |
| Автор: Heathen 14.11.2002, 00:51 |
| Огромное спасибо! Все работает и ADOQuery.Insert тоже. Правда есть один фокус при вводе новых строк (Insert) в ключевом автоинкрементном поле ставятся нули, которые после active.false/true заменяются автоинкрементом - ну это мелочи. По ходу возник следующий вопрос: SQL: Select * From MyTable1 union all Select * From MyTable2 union all Select * From MyTable3 Это мы объединили три таблицы, но при попытке внести изменения через клик на Гриде выдается ошибка. Как это можно обойти? |
| Автор: Vit 14.11.2002, 01:20 |
| Никак - Union не обеспечивает возможность редактирования таблицы. Надо доработать дизайн, или делать в коде - добавить ещё одну ADOQuery и с помощью неё удалить записи. Модератор: Давай такие вопросы задавать в новом топике. 1 топик - 1 вопрос |