Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Не работает ОТКАТ в ТРАНЗАКЦИИ [D7, Paradox]


jz6 ©   (2005-02-26 14:52:00) 

У меня на форме компоненты:
1)Database1:TDatabase
2)Query1:TQuery,
3)СheckBox1:TCheckBox;
4)Кнопка...

В Database1 -
1)AliasName - 'Псевдоним1'(он зарегестрирован в BDE),
2)DatabaseName - 'ИмяБазыДанных1',
3)Database1.Connected:=True;
4)Уровень транзакции - DirtyRead(об этом просит компилятор);

В Query1 -
1)DatabaseName - 'ИмяБазыДанных1',
2)Query1.SQL - 'Delete from ':ИмяБазыДанных1:Proba.db' where A=3'

Таблица - 3 поля типа Integer;

Мне надо чтобы если CheckBox1.Checked=True то транзакция завершается подтверждением если иначе - откатом.

При нажатии кнопки работает программа:

Database1.StartTransaction;
try
  Q.ExecSQL;
     if C.Checked=true
     then  
       begin
          Database1.Commit;
             ShowMessage('Подтверждение');
       end
else
      begin
        ShowMessage('Удаление данных не ведётся');
           Database1.Rollback;
             ShowMessage('Откат');
      end;

except
ShowMessage('Ошибка в выполнении удаления!!');
   Database1.Rollback;
    ShowMessage('Откат');
      Abort;
         end;
end;  

Если я снимаю галочку(СheckBox1.Checked=False) то Database1.Rollback(ОТКАТ) выполняется, но все равно данные в таблицы - удалены. Отката нет.

Я уверен что тут дело в самом SQL - операторе.

Он напрямую обращается к таблице, и никакие транзакции его не тревожат. Я долго возился с псевдонимами, но ничего не достиг.
Прошу помощи.


jz6   (2005-03-01 02:06:00) [1]

'Есть у таблицы индекс?'

А вот и нету! Я его удалил давно, так как эта таблица - просто
пробная! Похоже на правду! Проверю!

Спасибо большое!

И вопрос: откуда черпаются такие данные о формате Paradox?


DiamondShark   (2005-02-26 21:42:00) [2]

Но они всё-таки поддерживаются. С ограничениями:

· For standard databases (Paradox, dBASE, FoxPro, Access) there is no automatic crash recovery or DDL-related actions such as table create, restructure, index creation, table/index deletion, and so on.
· To perform transactions on a Paradox table, a valid index must exist. Data cannot be rolled back on Paradox tables lacking an index.
· Inserts rolled back on dBase and FoxPro tables are actually only soft deletes.
· Local transaction do not work for temporary tables.

· Local transactions do not work for the Text driver (ASCII files).
· For Access, if you do not supply a user name and use user-level security you can only have one active transaction. Transactions are occurring at the driver level not at the database level.

Первый и последний пункт нас не интересует, а вот второй -- да.
Есть у таблицы индекс?


DiamondShark   (2005-02-26 21:28:00) [3]


> но не хочу в это верить

Это только горы можно силой веры двигать.
А транзакции если не поддерживаются, значит не поддерживаются. Совсем.


jz6   (2005-02-26 17:08:00) [4]

Спасибо за дельные предложения, Дмитрий!

Отката все равно нет. Даже не смешно.

"paradox не поддерживает транзакции" - может быть и так, но не хочу в это верить. Нигде такого не читал.


Вольный Стрелок   (2005-02-26 16:18:00) [5]

paradox не поддерживает транзакции


DSKalugin   (2005-02-26 15:48:00) [6]

псевдонимы в запросе не нужны
Query1.SQL.Text:='Delete from Proba where A=3';
Уровень изоляции транзакций надо ставить в
tiReadCommitted. Совсем не ясно о чем тебя просит компилятор
разница существенная.
Для tiDirtyRead читаются И неподтвержденные транзакции тоже
для tiReadCommitted только подтвержденные
и пиши красиво, хотя это дело стиля, конечно,но совсем не удобно читать

Database1.StartTransaction;
try
 Q.ExecSQL;
 if C.Checked then begin
   Database1.Commit;
   ShowMessage('Подтверждение');
 end
 else begin
   Database1.Rollback;
   ShowMessage('Удаление данных не ведётся. Откат');
 end;
except
 Database1.Rollback;  
 ShowMessage('Ошибка в выполнении удаления!!');
 Abort; //это еще зачем? вызови лучше raise
 end; //это еще зачем? лишняя
end;  

так сразу видно логику и лишний ЭНД :-)


Наверх

Титульная страница Поиск, карта сайта Написать письмо