Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.02.13;
Скачать: CL | DM;

Вниз

Ошибка при записи изменений в Oracle через dbExpress   Найти похожие ветки 

 
Mefodiy   (2005-01-07 09:33) [0]

Для работы с Oracle в режиме read-write использую стандартную цепочку компонент:
TSQLConnection<--TSQLQuery<--TDataSetProvider<--TClientDataSet<--TDataSource<--TDBGrid
 Для вывода данных на экран прописал на нажатие кнопки:
 with SQLQuery1 do
 begin
   Close;
   SQL.Clear;
   SQL.Add("select * from MyFile");
   Open;
 end;
DBGrid нормально отображает данные таблицы.
На нажатие другой кнопки прописал:
 var Translnfo: TTransactionDesc;
 ...
 Translnfo.TransactionID := 1;
 Translnfo.IsolationLevel := xilREADCOMMITTED;
 with SQLConnection1 do
 begin
   if (ClientDataSet1.ChangeCount > 0) and
      (Not InTransaction) then
     begin
       StartTransaction(Translnfo);
       ClientDataSet1.ApplyUpdates(0);
       try
         Commit(Translnfo);
       except
         Rollback(Translnfo);
       end;
     end;
 end;
Изменяю данные в DBGrid. Нажимаю вторую кнопку, чтобы сохранить данные в базе и получаю сначала
 "SQLQuery1: Cannot modify a read-only dataset"
а затем
 "Unable to find record. No key specified"
  Понимаю, что SQLQuery1 сам по себе дает однонаправленный и не подлежащий редактированию набор данных. Но, как пишут во всех статьях по dbExpress ее сочетание с TDataSetProvider и TClientDataSet должно обеспечивать полноценный режим read-write.
  Перепробовал всевозможное сочетание различных параметров. Все бесполезно. Видимо в чем то принципиальная ошибка.
  Помогите советом. Спасибо.


 
Наталия ©   (2005-01-08 06:44) [1]

Я не знаток данных компонент, но в качестве предположения, возможно, нужно использовать запрос вида
"select rowid,* from MyFile"?


 
Dell3r ©   (2005-01-08 10:47) [2]

Попробуй в квери свойство RequiestLive поставить в труе.
говорят помогает. сам не пробовал.


 
Mefodiy   (2005-01-10 13:55) [3]

>Наталия ©  
"select rowid,* from MyFile" не помогло

>Dell3r ©  
У TSQLQuery нет свойства RequiestLive (оно есть у TQuery)


 
Deniz   (2005-01-10 15:42) [4]

Замени SQLQuery на SQLDataSet


 
Mefodiy   (2005-01-10 16:27) [5]

>Deniz
Замена SQLQuery на SQLDataSet дает ту же ошибку


 
Deniz   (2005-01-11 07:14) [6]

На Oracle не могу проверить :-( но, сделав небольшую форму для редактирования таблички в FireBird, все работало как надо, возможно у тебя что-то с правами или запрос из нередактируемой вьюхи или еще чего ... попробуй в новом проекте сделать с одной табличкой.


 
Desdechado ©   (2005-01-11 11:04) [7]

Боюсь, что до приведенного кода сохранения дело не доходит просто. Ты протрассируй программу в отладчике. Похоже, срабатывает событие на Post. А еще в запросе, скорее всего, отсутствует первичный или уникальный ключ. Поэтому "no key specified". А "read-only dataset" наверняка стоит где-нибудь в свойствах перечисленых компонентов и к однонаправленности TSQLQuery отношения не имеет.


 
Mefodiy   (2005-01-14 10:39) [8]

Проблема решилась следующим образом:
1.Поменял TSQLQuery на TSQLTable.
2.В TDataSetProvider стояло ResolveToDataSet := True, а нужно было False (отсюда ошибка "Cannot modify a read-only dataset")
3.В таблицу добавил Primary Key, т.к. его не было (отсюда ошибка "Unable to find record. No key specified")
  Всем спасибо.


 
Desdechado ©   (2005-01-14 11:14) [9]

п.1 сделал зря


 
Mefodiy   (2005-01-14 12:48) [10]

>Desdechado ©

При использовании TSQLQuery возникает та же ошибка "Unable to find record. No key specified"


 
ЮЮ ©   (2005-01-14 12:54) [11]

так п.1 - зря, а п.3 - просто необходим



Страницы: 1 вся ветка

Текущий архив: 2005.02.13;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.025 c
1-1107259732
Alex_1
2005-02-01 15:08
2005.02.13
кодировка в поле ввода Edit


9-1099849062
MsShtaer
2004-11-07 20:37
2005.02.13
Тени в DirectX


14-1106372997
boriskb
2005-01-22 08:49
2005.02.13
Мужчина и женщина


14-1106559025
Ega23
2005-01-24 12:30
2005.02.13
comma-delimited string


9-1099832251
ASH
2004-11-07 15:57
2005.02.13
Звук для игр на Delphi..