Не фиксируются изменения в кэшированном 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. Потом код закомментировал и забыл, а оказалось в нем и была проблема, как тока убрал - все заработало. К чему бы это?