![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Не работает ОТКАТ в ТРАНЗАКЦИИ [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;
так сразу видно логику и лишний ЭНД :-)