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

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

Кто работал с 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) при открытии таблици (для всей БД нужно все последовательно пооткрывать).


Наверх

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