Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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
Код
ADOQuery1.sql.text:='delete from table1 where id_n= :id';
ADOQuery1.parameters.parseSQL(ADOQuery1.sql.text,true);
ADOQuery1.parameters.parambyname('id').value:=5;
ADOQuery1.ExecSQL;


Можно и проще:
Код

ADOQuery1.sql.text:='delete from table1 where id_n=5';
ADOQuery1.ExecSQL;

Автор: 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, 06:23)
ADOTable- не подходит, он ведь в отличии от Query работает c одной таблицей, так?

Да!

Автор: 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
Огромное спасибо! :D


   Все работает и  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 вопрос

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)