![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Кто работал с halcyon [D6, dBase, FoxPro]
_BasiL_ © (2003-03-17 13:32:00)Если БД испорченна, то как и где программно это узнать, в каких событиях?
sniknik (2003-03-17 17:17:00) [1]_BasiL_ © (17.03.03 17:08)
> sniknik © (17.03.03 16:54)
> Правильно пишется except
точно except, а ты думал чтобы на память да без ошибок?
_BasiL_ (2003-03-17 17:08:00) [2]sniknik © (17.03.03 16:54)
Правильно пишется ex cept
Вот работающее событие стандартного Table
procedure TDM.OrdersDeleteError(DataSet: TDataSet; E: EDatabaseError;
var Action: TDataAction);
begin
if E is EDBEngineError then
if (E as EDBEngineError).Errors[0].Errorcode = eDetailsExist then
begin
if MessageDlg("Delete this order and related items?", mtConfirmation,
[mbYes, mbNo], 0) = mrYes then
begin
{Delete related records in linked "items" table}
while Items.RecordCount > 0 do
Items.delete;
{Finally,delete this record}
Action := daRetry;
end else Abort;
end;
end;
При возникании ошибки можно удалить запись по желанию, вот что-то вроде этого и я хотел сделать с Halcyon`ом, но неполучается.
myor (2003-03-17 17:04:00) [3]как это "в одном месте"?
ты уверен, что ошибка программная?
тогда определи, какая операция к этому привела (отталкивайся от побитых данных). а если это был разовый сбой? как ты хочешь определить причину? тут можно только попробовать восстановить бд (отбраковать битые данные).
sniknik (2003-03-17 16:54:00) [4]в одном месте(программы) точно нельзя, ведь по ходу работаеш с разными таблицами, записями.
любое действие с таблицей в try exept (post тоже) и обработку на случай ошибки. по другому некоректно (хотя если устраивают стандартные сообщения об ошибках) и откатов/обработок исключительных ситуаций не нужно, то почему нет? можеш без exept.
_BasiL_ (2003-03-17 16:32:00) [5]sniknik © (17.03.03 16:13)
Получается, что перед каждым редактированием, post`ом надо проверять на ошибку и никак ее отловить в одном месте нельзя?
_BasiL_ (2003-03-17 16:23:00) [6]Под кашея я подразумеваю текст несоответствующий полям и их типам! На хороших записях программа работает корректно, когда доходит дело вот до этой каши программа ругается. Я хочу отловить эту ошибку и востановить (удалить) испорченные записи!
В стандартном Table ошибка ловиться в событии onDeleteError в Halcyon`е он даже в это событие и незаходит.
Где поймать эту ошибку, подскажите.
sniknik (2003-03-17 16:13:00) [7]_BasiL_ © (17.03.03 15:55)
при открытии таблици не делается ее тестирование/сканирование всех записей (куча времени потратится). по идее весь код работы с базой/(и не только), должен в try exept находится. и обрабатывать ошибки "по ходу программы".
myor (2003-03-17 16:02:00) [8]if db.demaged=true :)
определи условия(результаты, данные, события), которые ты считаешь ошибкой бд. а потом ищи их в своей бд.
не открывается бд: файл переименован? изменен путь? не зарегистрирован пользователь?
каша в бд: несоответствие типов данных? отсутствие данных?
Dred2k (2003-03-17 15:58:00) [9]Application.OnException
_BasiL_ (2003-03-17 15:55:00) [10]Если я вставляю этот код, то у меня БД открывается без проблем, а при добавлении (создании) индексного файла он пишет, что такого поля нет. Далее передвигаюсь по БД на неиспорченных записях все ОК, а как дохожу до каши, то вылазиет ошибка. Где ловить эту ошибку, в каком событии?
PrettyFly (2003-03-17 15:12:00) [11]Испорти и посмотри, что будет ;)
sniknik (2003-03-17 14:56:00) [12]путаеш с чем то, с этим?
DbiError obtains the error string from the BDE for the error and raises an EDBEngineError exception.
а EDatabaseError обший не будет BDE он все одно будет. (без BDE работает) ->
try
HDataSet1.Close;
HDataSet1.DatabaseName:= PathZ;
HDataSet1.TableName:= "CURRESTS.DBF";
HDataSet1.Open;
exept
on E: EDataBaseError do begin ErrMessage:= "EDataBaseError : "+ E.Message; Err:= True; end;
end;
_BasiL_ (2003-03-17 14:43:00) [13]Каким образом это осуществить не используя ВДЕ?
sniknik (2003-03-17 13:46:00) [14]там же где и у других на EDatabaseError exception (в блоке try exept ... end) при открытии таблици (для всей БД нужно все последовательно пооткрывать).