Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > 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 вопрос |