не сохраняются изменения через TSQLQuery

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

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

не сохраняются изменения через TSQLQuery

Сообщение RusDeveloper » 24.05.2016 15:58:05

Редактирую табличку в БД через TSQLQuery. Прописал все запросы в TSQLQuery (на выборку, обновление, изменение, вставку, удаление). Прописал Sequence (имя и поле). У транзакции в свойствах вроде все есть:
read_committed
rec_version
nowait

да, и данные через другой TSQLQuery сохраняются в БД (там используется только свойство SQL и выполняется ExecSQL). Вот пример кода, который не приводит к изменению данных в БД, а точнее данные в БД не вставляются (увеличивается только значение у Sequence):
Код: Выделить всё
  sqlQuery1.Append;
  sqlQuery1.FieldByName('T_SHORT_NAME').AsString := 'короткое наименование';
  sqlQuery1.Post;
  SQLTransaction1.CommitRetaining;

Вот запрос из InsertSQL:
Код: Выделить всё
INSERT INTO TEST
(
  T_ID,
  T_SHORT_NAME
)
VALUES
(
  GEN_ID(GEN_TEST_ID,1),
  :T_SHORT_NAME
)   


Если к sqlQuery1 прикрутить грид, то вроде все хорошо работает, но после переоткрытия запроса добавленная строка (ее видно в гриде) пропадает, т.е.:
Код: Выделить всё
  sqlQuery1.Append;
  sqlQuery1.FieldByName('T_SHORT_NAME').AsString := 'короткое наименование';
  sqlQuery1.Post;
  SQLTransaction1.CommitRetaining;
  //видим, что строка добавилась
  //в параллельной транзакции мы эту строку не видим
  //т.е. она есть только в sqlQuery1
  sqlQuery1.Close;
  sqlQuery1.Open;
  //видим, что строка пропала

это так и должно быть? TSQLQuery еще слишком сырой и не умеет работать с InsertSQL и UpdateSQL? или есть какая-то хитрость?

Добавлено спустя 25 минут 45 секунд:
а если переписать InsertSQL на
Код: Выделить всё
INSERT INTO TEST
(
  T_ID,
  T_SHORT_NAME
)
VALUES
(
  :T_ID,
  :T_SHORT_NAME
)

то все то же самое, только генератор не увеличивается на 1
RusDeveloper
новенький
 
Сообщения: 92
Зарегистрирован: 06.04.2016 12:02:43

Re: не сохраняются изменения через TSQLQuery

Сообщение resident » 24.05.2016 16:58:21

RusDeveloper писал(а):это так и должно быть?

Да.

Добавлено спустя 21 минуту 27 секунд:
RusDeveloper писал(а):или есть какая-то хитрость?

ApplyUpdates
http://wiki.freepascal.org/Working_With ... ed_Updates

RusDeveloper писал(а):генератор не увеличивается на 1

Там же
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: не сохраняются изменения через TSQLQuery

Сообщение RusDeveloper » 25.05.2016 12:30:48

вот про TSQLQuery.ApplyUpdates (по ссылке, которую вы запостили):
the updates are not sent immediately to the database, but are kept in memory till the ApplyUpdates method is called

а вот про TDataSet.Post, от которого наследован TSQLQuery (из справки к Lazarus):
Post attempts to save pending edits when the dataset is in one of the edit modes: that is, after a Insert, Append or TDataset.Edit operation. The changes will be committed to memory - and usually immediatly to the underlying database as well.

в Delphi, например, все работают с Post, а не с какими-то ApplyUpdates... кто-то сможет объяснить разницу между Post и ApplyUpdates в теории и на практике? или в теории они идентичны, а на практике работает только ApplyUpdates?
RusDeveloper
новенький
 
Сообщения: 92
Зарегистрирован: 06.04.2016 12:02:43

Re: не сохраняются изменения через TSQLQuery

Сообщение Ism » 25.05.2016 19:14:26

ApplyUpdates позволяют отправлять много накопленных изменений за раз в базу
Post отправляет одну запись в буфер из которого ее берет ApplyUpdates

В delphi тоже гдето есть такой режим работы датасета

Хотя в том же zeoslib достаточно Post
Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Re: не сохраняются изменения через TSQLQuery

Сообщение resident » 26.05.2016 00:15:05

RusDeveloper писал(а):в Delphi, например, все работают с Post, а не с какими-то ApplyUpdates...

Внезапно
Внезапно 2
и.т.д.и.т.п

Добавлено спустя 2 минуты 8 секунд:
RusDeveloper писал(а):и на практике?


Код: Выделить всё
procedure TCustomSQLQuery.Post;
begin
  inherited Post;
  If (sqoAutoApplyUpdates in Options) then
    ApplyUpdates;
end; 
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: не сохраняются изменения через TSQLQuery

Сообщение RusDeveloper » 26.05.2016 16:08:39

Ism писал(а):ApplyUpdates позволяют отправлять много накопленных изменений за раз в базу

почему тогда UpdateStatus in [usModified, usInserted, usDeleted] только для той записи, которую изменили? а не для датасета в целом? как мне определить были ли сделаны изменения или нет для некоторых записей из множества? не перебирать же все записи по очереди в TSQLQuery, проверяя UpdateStatus...

Добавлено спустя 3 минуты 4 секунды:
resident
да, в Delphi есть ApplayUpdates, но там я обходился Post-ами и Commit-ами, а здесь без ApplyUpdates ничего в БД не попадает :(
RusDeveloper
новенький
 
Сообщения: 92
Зарегистрирован: 06.04.2016 12:02:43

Re: не сохраняются изменения через TSQLQuery

Сообщение resident » 26.05.2016 17:38:32

RusDeveloper писал(а):как мне определить были ли сделаны изменения или нет для некоторых записей из множества?

А как вы в Delphi это определяли?

Добавлено спустя 7 минут 35 секунд:
RusDeveloper писал(а):там я обходился Post-ами и Commit-ами, а здесь без ApplyUpdates ничего в БД не попадает

Кхе, в Delphi здесь что?
Код: Выделить всё
procedure TCustomSQLQuery.Post;
begin
  inherited Post;
  If (sqoAutoApplyUpdates in Options) then
    ApplyUpdates;
end; 

Если тоже самое, то это значит, что в Delphi в Инспекторе Объектов, есть секция Options и там вы увидите установленную для ленивых (в Delphi много чего для ленивых) галочку sqoAutoApplyUpdates.
Если в Лазарусе поставьте её здесь сами, то забудете про ApplyUpdates.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: не сохраняются изменения через TSQLQuery

Сообщение RusDeveloper » 27.05.2016 11:20:34

resident
не вижу я таких настроек в Delphi. видимо о разных версиях говорим. но вдаваться в различия между версиями делфи и сравнивать все это с Лазарусом не вижу смысла. и в коде для Post ApplayUpdates тоже не вижу:
Код: Выделить всё
procedure TIBCustomDataSet.Post;
var
  i : Integer;
begin
  if (FGeneratorField.ApplyEvent = gamOnServer) and
      FGeneratorField.IsComplete then
    FieldByName(FGeneratorField.Field).Required := false;

  UpdateRecord;
  if State = dsInsert then
  begin
    for i := 0 to Fields.Count - 1 do
    begin
      if (Fields[i].IsNull) and (Fields[i].DefaultExpression <> '') then
        Fields[i].Value := Fields[i].DefaultExpression;
    end;

    if FGeneratorField.ApplyEvent = gamOnPost then
      FGeneratorField.Apply;
  end;
  inherited Post;
end;
...
procedure TDataSet.UpdateRecord;
begin
  if not (State in dsEditModes) then DatabaseError(SNotEditing, Self);
  DataEvent(deUpdateRecord, 0);
end;


Добавлено спустя 4 минуты 6 секунд:
вот еще из предка немного кода:
Код: Выделить всё
procedure TDataSet.Post;
begin
  UpdateRecord;
  case State of
    dsEdit, dsInsert:
      begin
        DataEvent(deCheckBrowseMode, 0);
        DoBeforePost;
        CheckOperation(InternalPost, FOnPostError);
        FreeFieldBuffers;
        SetState(dsBrowse);
        Resync([]);
        DoAfterPost;
      end;
  end;
end;
У вас нет необходимых прав для просмотра вложений в этом сообщении.
RusDeveloper
новенький
 
Сообщения: 92
Зарегистрирован: 06.04.2016 12:02:43

Re: не сохраняются изменения через TSQLQuery

Сообщение RusDeveloper » 30.05.2016 17:12:33

RusDeveloper писал(а):
Ism писал(а):ApplyUpdates позволяют отправлять много накопленных изменений за раз в базу

почему тогда UpdateStatus in [usModified, usInserted, usDeleted] только для той записи, которую изменили? а не для датасета в целом? как мне определить были ли сделаны изменения или нет для некоторых записей из множества? не перебирать же все записи по очереди в TSQLQuery, проверяя UpdateStatus...

вопрос актуален
RusDeveloper
новенький
 
Сообщения: 92
Зарегистрирован: 06.04.2016 12:02:43

Re: не сохраняются изменения через TSQLQuery

Сообщение Снег Север » 30.05.2016 23:13:57

С какой именно базой данных вы работаете? Как вы сравниваете с Делфи, если там заведомо другие компоненты доступа к БД?

Если это SQLite, то там ApplyUpdates крайне рекомендуется делать один раз, после завершения большой серии Update'ов. Иначе получается очень медленно.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2993
Зарегистрирован: 27.11.2007 16:14:47

Re: не сохраняются изменения через TSQLQuery

Сообщение RusDeveloper » 31.05.2016 10:53:19

Снег Север писал(а):С какой именно базой данных вы работаете? Как вы сравниваете с Делфи, если там заведомо другие компоненты доступа к БД?

с FB. я сравниваю не компоненты, а подход. в Lazarus пользуюсь TSQLQuery. и вопрос на данный момент в следующем:
RusDeveloper писал(а):почему тогда UpdateStatus in [usModified, usInserted, usDeleted] только для той записи, которую изменили? а не для датасета в целом? как мне определить были ли сделаны изменения или нет для некоторых записей из множества? не перебирать же все записи по очереди в TSQLQuery, проверяя UpdateStatus
RusDeveloper
новенький
 
Сообщения: 92
Зарегистрирован: 06.04.2016 12:02:43

Re: не сохраняются изменения через TSQLQuery

Сообщение Снег Север » 31.05.2016 20:27:46

Мне непонятно почему вы считаете, что UpdateStatus не для датасета в целом. И статус датасета после Post совершенно необязательно связан со статусом таблиц на сервере. Для передачи изменений служит Commit. А вот как и что вызывается, автоматически или вручную, очень сильно зависит от используемых компонентов.

Если бы вы использовали одни и те же компоненты, например, Zeos, то работало бы одинаково.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2993
Зарегистрирован: 27.11.2007 16:14:47

Re: не сохраняются изменения через TSQLQuery

Сообщение RusDeveloper » 01.06.2016 16:55:35

Снег Север писал(а):Мне непонятно почему вы считаете, что UpdateStatus не для датасета в целом.

RusDeveloper писал(а):почему тогда UpdateStatus in [usModified, usInserted, usDeleted] только для той записи, которую изменили? а не для датасета в целом?

у меня такое чувство, что никто не читает мои сообщения :?
RusDeveloper
новенький
 
Сообщения: 92
Зарегистрирован: 06.04.2016 12:02:43

Re: не сохраняются изменения через TSQLQuery

Сообщение pupsik » 01.06.2016 17:31:39

...не перебирать же все записи по очереди в TSQLQuery, проверяя UpdateStatus..
и почему такой вариант не подходит?
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: не сохраняются изменения через TSQLQuery

Сообщение Снег Север » 01.06.2016 22:49:32

RusDeveloper писал(а):почему тогда UpdateStatus in [usModified, usInserted, usDeleted] только для той записи, которую изменили? а не для датасета в целом?
Вероятно я туплю, но мне как раз непонятно, что это написано??? Никогда не видел UpdateStatus для отдельной записи...
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2993
Зарегистрирован: 27.11.2007 16:14:47

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 20

Рейтинг@Mail.ru