Не фиксируются изменения в кэшированном Smartquery (ODAC5.1)

Бульбаш
Дата: 07.06.2011 10:49:19
Имеется кэшированный SmartQuery (Autocommit=False; CachedUpdates=True).
Пытаюсь переслать данные в БД с помощью классического кода из хэлпа (if updatepending...applyupdates ...).
Изменения не фиксируются. Проверил - после отработки кода кэш не очищается после
CommitUpdates. Все что нарыл по этому поводу что в одаке этот режим слегка глюкавый.

Подскажите плиз, можно ли заставить работать кэширование и как это сделать?
devart
Дата: 07.06.2011 11:09:08
Бульбаш,

Вы используете очень старую версию ODAC, в поздних версия эта проблема уже исправлена. Для решения данной проблемы, Вам достаточно скачать последнюю версию ODAC.
Бульбаш
Дата: 07.06.2011 15:31:41
Нашел у коллег 6.9, поставил. Теперь кэш очищает, но все равно не сохраняет, пишет: Update failed и все...
devart
Дата: 07.06.2011 16:35:09
Бульбаш,

Ниже приведен рабочий пример кода с использованием CachedUpdates, пожалуйста выполните его и проверьте что данные корректо заносятся в таблицу. Если этот код успешно выполняется, пожалуйста приведите свой код и мы постараемся помочь Вам решить эту проблему.
var
  OraSession: TOraSession;
  OraQuery: TSmartQuery;
begin
  OraSession:= TOraSession.Create(nil);
  try
    OraSession.ConnectString:= 'user/password@database';
    OraSession.Connect;
    OraSession.ExecSQL('CREATE TABLE T_CACHEDUPDATES(ID NUMBER, TEXT VARCHAR2(10))',[]);
    OraQuery:= TSmartQuery.Create(nil);
    try
      OraQuery.Session := OraSession;
      OraQuery.AutoCommit:= false;
      OraQuery.CachedUpdates:= true;
      OraQuery.SQL.Text := 'SELECT * FROM T_CACHEDUPDATES';
      with OraQuery do
      begin
        OraSession.StartTransaction;
        try
          Open;
          Insert;
          FieldByName('ID').AsInteger := 1;
          FieldByName('Text').AsString := 'test';
          Post;
          ApplyUpdates;
          Session.Commit;
        except
          RestoreUpdates;
          OraSession.Rollback;
          raise;
        end;
        CommitUpdates;
      end;
    finally
      OraQuery.Free;
    end;
  finally
    OraSession.Free;
  end;
devart
Дата: 07.06.2011 16:36:29
Бульбаш,

P.S. этот код тестировался на последней версии ODAC (7.20.0.6)
Бульбаш
Дата: 07.06.2011 16:55:40
Ваш код работает,то есть насколько я понимаю к настройкам сервера претензий нет.
Вот мой код пересылки изменений в БД:
           if DM.Pfakt.UpdatesPending then 
             begin
             DM.OraSession.StartTransaction;
             try
             DM.Pfakt.ApplyUpdates;
             DM.OraSession.Commit;
             except
             DM.OraSession.Rollback;
             raise;
             end;
             DM.Pfakt.CommitUpdates;
             end;
cxGrid связан с Pfakt. Вставка, изменение и удаление записей производится в нем или по циклу в делфовой процедуре. Затем нажатием кнопки выполняется вышеприведенный код, к сожалению безрезультатно...
devart
Дата: 07.06.2011 18:02:52
Бульбаш,

Ваш код при изменении данных из TcxGrid также работает.

Пожалуйста приведите полный текст ошибки "Update failed ?", а также строку на которой возникает эта ошибка, и текст запроса который выполняется при изменении данных, его можно посмотреть включив Debug режим:

....
Uses ....,OdacVcl;
.......
DM.OraSession.Debug:= True;
Бульбаш
Дата: 08.06.2011 11:44:35
Выдает сообщение: проект вызвал исключение класса EDatabaseError с сообщением 'Update Failed'

procedure TDataSetUpdater.DoApplyRecord(UpdateKind: TUpdateRecKind; var Action: TUpdateRecAction; LastItem: boolean);
var
OldModified: boolean;
UpdateAction: TUpdateAction;
begin
OldModified := FDataSet.Modified; // NewValue change Modified ??? or MemDS
try
UpdateAction := uaFail;
try
if Assigned(FDataSet.OnUpdateRecord) then begin
FDataSet.OnUpdateRecord(FDataSet, TUpdateKind(UpdateKind), UpdateAction);
case UpdateAction of
uaFail:
if not DoNotRaiseExcetionOnUaFail then
raise EDatabaseError.Create(SCustomUpdateFailed);
uaAbort:
Abort;
Наш админ грит что к серверу обращения нет, все обрубается на уровне клиента
devart
Дата: 08.06.2011 12:00:20
Бульбаш,

Ка я уже писал ранее на "простых" таблицах и данных все работает корректно.

Если Вы сможете создать небольшой тестовый пример (со скриптами создания и заполнения таблиц) который воспроизводил бы проблему, отправьте его пожалуйста на alexp*devart*com и мы попытаемся воспроизвести проблему и помочь Вам в ее решении.
Бульбаш
Дата: 13.06.2011 17:21:45
Разобрался с проблемой, но сути ее не понял. Положил на форму новый SmartQuery с таким же SQL. Начал гонять - работает. Потом нашел отличие: Еще до установки 6-го одака экспериментировал с событием onUpdateRecord. Потом код закомментировал и забыл, а оказалось в нем и была проблема, как тока убрал - все заработало. К чему бы это?