Редактирование данных

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
Аватара пользователя
alexsa
новенький
Сообщения: 28
Зарегистрирован: 02.06.2011 23:10:20

Редактирование данных

Сообщение alexsa »

Всем привет!
Объясните пожалуйста, как правильно построить код, чтобы Лазарус не ругался.

Код: Выделить всё

      if SQLQuery1.State in [dsEdit] then                                                           
      begin                                                                                         
          SQLQuery1.Close;                                                                         
          SQLQuery1.SQL.Text:='update groups set naimenovanie="'+EditNew.Text+'" where id_group=2';
          SQLQuery1.Open;
          SQLQuery1.Post;
...........................................
      end; 

SQLQuery1: Cannot open a non-select statement

Лазарус начинает ругаться на SQLQuery1.Open;
Когда я реализую этот запрос в той же базе только через броузер, где вместо "'+EditNew.Text+'" завожу данные, то все работает
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

Так вам ошибка "чёрным по белому" сообщает, что запрос не возвращает значения.
Для INSERT, UPDATE и другой подобной лобуде не возвращающей наборы данных, используйте метод SQLQuery1.ExecSQL.

ps В данном случае нет смысла проверять набор на режим редактирования. Тем более это SQL.

psps Дам совет: сначала почитайте мат.часть да и англицкий неплохо бы знать.

Добавлено спустя 1 минуту 30 секунд:
Да и метод Post тут совершенно неуместен т.к. SQL и все операции производятся на стороне сервера, а не в вашем наборе.
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

Ваша ошибка - в этом:
alexsa писал(а):SQLQuery1.Open;

Метод Open можно делать только для апросов, которые начинаются с волшебного слова SELECT.
Open - оначает "открыть набор данных". А набор данных образуется только после выборки данных, т.е. после SELECT. Во всех других случаях Вы пытаетесь открыть то, чего нет. Lazarus Вас правильно обругал. ;)
Делайте так:

Код: Выделить всё

SQLQuery1.ExecSQL;

и будет Вам щастье. :)
Аватара пользователя
alexsa
новенький
Сообщения: 28
Зарегистрирован: 02.06.2011 23:10:20

Сообщение alexsa »

Код: Выделить всё

      begin                                                                                         
           SQLQuery1.Close;                                                                         
           SQLQuery1.SQL.Text:='update groups set naimenovanie="'+EditNew.Text+'" where id_group=2';
           SQLQuery1.ExecSQL;     
           SQLQuery1.ApplyUpdates;
           SQLTransaction1.Commit;


Теперь ругается, что dataset не активный..., уберешь SQLQuery1.Close; - ругается, что активный

Добавлено спустя 14 минут 11 секунд:
Re: Редактирование данных

Сообщение alexsa 23.06.2011 17:24:28

Код: Выделить всё

Код: Выделить всё

          begin                                                                                         
               SQLQuery1.Close;                                                                         
               SQLQuery1.SQL.Text:='update groups set naimenovanie="'+EditNew.Text+'" where id_group=2';
               SQLQuery1.ExecSQL;     
               SQLTransaction1.Commit;
          end;


Всем спасибо. Вот так теперь работает.

Добавлено спустя 20 минут 21 секунду:
Mr.Smart писал(а):psps Дам совет: сначала почитайте мат.часть да и англицкий неплохо бы знать.


Дайте ссылку на матчасть по этой теме... Да, а с заморским языком, действительно, проблема.. :D
gNEV
новенький
Сообщения: 26
Зарегистрирован: 23.07.2010 14:20:06
Откуда: Санкт-Петербург

Сообщение gNEV »

Я пишу так (Zeos):

Код: Выделить всё

with Query.SQL do
  begin
    Clear;
    Add('запрос');
  end;
Query.ExecSQL; или Query.Open в зависимости от необходимости
транзакции сначала открываются
 Тырпыр.StartTransaction;
try
 with Query.SQL do
  begin
    Clear;
    Add('запрос');
  end;
 Query.ExecSQL;
тырпыр.Commit;
except
  тырпыр.Rollback;
  тут можно указать что транзакция не прошла.
end;
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

alexsa писал(а):Дайте ссылку на матчасть по этой теме...

Любая книжка по Дельфи, где описывается работа с компонентами TQuery, ADO, InterBase... Всё, что в них описывается по работе с запросами, одинаково во всех компонентах.
Ответить