Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.08.07;
Скачать: [xml.tar.bz2];

Вниз

Получить по коду ошибки EDBEngineError её описаниe.   Найти похожие ветки 

 
IronHawk   (2003-07-09 14:33) [0]

На форме есть:
Edit - в который будет вводиться код в виде числовом виде (скажем $2501 или просто 2501)
Button - по нажатию которого описание ошибки, введенной в Edit, должно появляться в Memo
Memo - в котором долно появляться описание.


 
IronHawk   (2003-07-09 14:35) [1]

Вот нарыл кое чего, но оно не отрабатывает:
Информация об ошибке BDE может быть получена для использования в приложении
из EDBEngineError. Исключительная ситуация EDBEngineError обрабатывается в
программе с помощью конструкции try ... except. Когда возникает исключительная
ситуация BDE, то может быть создан объект EDBEngineError и различные поля этого
объекта могут быть использованы для программного определения, что не в порядке
и что требуется для исправления ситуации. Далее, для данной исключительной
ситуации может быть сгенерировано несколько сообщений об ошибках. Это требует
организации перебора сообщений об ошибках для получения нужной информации.

Поля, наиболее важные для данного контекста :

ErrorCount: Integer; показывает количество ошибок в св-ве Errors;
счет начинается с нуля.

Errors: TDBError; набор записей, которые содержат информацию о каждой
полученной ошибке; доступ к записям происходит по индексу типа Integer.

Errors.ErrorCode: DBIResult; показывает номер ошибки BDE для текущей
записи об ошибках в св-ве Errors.

Errors.Category: Byte; категория ошибки, относящаяся к полю ErrorCode.

Errors.SubCode: Byte; подкод (subcode) для значения в ErrorCode.

Errors.NativeError: LongInt; код удаленной ошибки, возвращаемый сервером;
если ноль, то это ошибка не сервера; возвращаемое SQL запросом значение
появляется в данном поле.

Errors.Message: TMessageStr; сообщение об ошибке, сервера или BDE.

В конструкции try..except объект создается напрямую в разделе except.
После создания можно работать поля обычным образом или передавать объект
в другую роцедуру для исследования ошибки. Кроме того, можно создать свой
собственный компонент для использования в данных целях; его набор
функциональных возможностей можно легко переносить между приложениями.
В примере ниже во время возникновения исключительной ситуации BDE создается
объект DBEngineError, передается в процедуру и анализируется для выделения
информации об ошибке.

В конструкции try..except, объект DBEngineError можно создать с помощью
синтаксиса, приведенного ниже:

procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
begin
if Edit1.Text > " " then begin
Table1.FieldByName("Number").AsInteger := StrToInt(Edit1.Text);
try
Table1.Post;
except on E: EDBEngineError do
ShowError(E);
end;
end;
end;

В этой процедуре делается попытка изменить значение поля в таблице и затем
вызывается метод Post соответствующей таблицы. В конструкцию try..except
заключается только попытка Post. Если при этом возникает ошибка BDE, то
выполняеся секция except, в которой создается объект E типа EDBEngineError и
затем E передается в процедуру ShowError. Заметьте, что только EDBEngineError
учитывается в данной конструкции. В реальной ситуации нужно, скорее всего,
проверять и другие виды исключительных ситуаций.

Процедура ShowError принимает объект EDBEngineError, передаваемый в качестве
параметра и исследует содержащиеся сообщения об ошибках. В данном примере
информация об ошибках показывается в компоненте TMemo. Первый шаг состоит в
определении количества действительно возникших ошибок. Для этого служит
св-во ErrorCount. После того, как стало известно количество ошибок, можно
использовать цикл для доступа к каждой записи об ошибке в свойстве Error
и помещению информацию о них в TMemo.

procedure TForm1.ShowError(AExc: EDBEngineError);
var
i: Integer;
begin
Memo1.Lines.Clear;
Memo1.Lines.Add("Number of errors: " + IntToStr(AExc.ErrorCount));
Memo1.Lines.Add("");
{Iterate through the Errors records}
for i := 0 to AExc.ErrorCount - 1 do begin
Memo1.Lines.Add("Message: " + AExc.Errors[i].Message);
Memo1.Lines.Add(" Category: " +
IntToStr(AExc.Errors[i].Category));
Memo1.Lines.Add(" Error Code: " +
IntToStr(AExc.Errors[i].ErrorCode));
Memo1.Lines.Add(" SubCode: " +
IntToStr(AExc.Errors[i].SubCode));
Memo1.Lines.Add(" Native Error: " +
IntToStr(AExc.Errors[i].NativeError));
Memo1.Lines.Add("");
end;
end;


 
IronHawk   (2003-07-09 14:35) [2]

Вот нарыл кое чего, но оно у меня не работает:
из EDBEngineError. Исключительная ситуация EDBEngineError обрабатывается в
программе с помощью конструкции try ... except. Когда возникает исключительная
ситуация BDE, то может быть создан объект EDBEngineError и различные поля этого
объекта могут быть использованы для программного определения, что не в порядке
и что требуется для исправления ситуации. Далее, для данной исключительной
ситуации может быть сгенерировано несколько сообщений об ошибках. Это требует
организации перебора сообщений об ошибках для получения нужной информации.

Поля, наиболее важные для данного контекста :

ErrorCount: Integer; показывает количество ошибок в св-ве Errors;
счет начинается с нуля.

Errors: TDBError; набор записей, которые содержат информацию о каждой
полученной ошибке; доступ к записям происходит по индексу типа Integer.

Errors.ErrorCode: DBIResult; показывает номер ошибки BDE для текущей
записи об ошибках в св-ве Errors.

Errors.Category: Byte; категория ошибки, относящаяся к полю ErrorCode.

Errors.SubCode: Byte; подкод (subcode) для значения в ErrorCode.

Errors.NativeError: LongInt; код удаленной ошибки, возвращаемый сервером;
если ноль, то это ошибка не сервера; возвращаемое SQL запросом значение
появляется в данном поле.

Errors.Message: TMessageStr; сообщение об ошибке, сервера или BDE.

В конструкции try..except объект создается напрямую в разделе except.
После создания можно работать поля обычным образом или передавать объект
в другую роцедуру для исследования ошибки. Кроме того, можно создать свой
собственный компонент для использования в данных целях; его набор
функциональных возможностей можно легко переносить между приложениями.
В примере ниже во время возникновения исключительной ситуации BDE создается
объект DBEngineError, передается в процедуру и анализируется для выделения
информации об ошибке.

В конструкции try..except, объект DBEngineError можно создать с помощью
синтаксиса, приведенного ниже:


 
DenK_vrtz   (2003-07-09 14:37) [3]

Описание будет не по-русски!
И на кой это надо?!


 
IronHawk   (2003-07-09 14:39) [4]


> DenK_vrtz © (09.07.03 14:37)

Ок!
Англ, супер!
НАДО!


 
DenK_vrtz   (2003-07-09 14:50) [5]

Смысл задачи то в чем?! Может все проще?


 
IronHawk   (2003-07-09 14:58) [6]


> DenK_vrtz © (09.07.03 14:50)

Чем тебе задача не угодила?
Что-то в ней не ясно?
Ну, НАДО мне тагой расшифровщик, был он у меня, а теперь сплыл, нужно новый и БЫСТРО наваять.
Помоги лучше проблемму решить, а не задачу поменять!


 
IronHawk   (2003-07-09 17:30) [7]

А может, всё таки, кто-то поможет?


 
sniknik   (2003-07-09 18:11) [8]

непонятно чем, и в чем проблема,

весь код (если я конечно правильно понял, разбиратся во всем что ты понаписал/скопировал увольте :о)) вот
try
Query1.Open;
raise EDBEngineError.Create(StrToIntDef(Edit1.Text, 0));
except
on E: EDBEngineError do ShowError(E);
end;

Query1.Open; обязательно должна завершатся нормально, иначе дальше не пройдет, убирать нельзя иначе вручную надо все создавать сессии ... т.д. ShowError твоя же процедура см. выше.
для проверки введи в едит 10024 (нет таблици), естественно не все цифры означают ошибки (0 успешное выполнение).


 
IronHawk   (2003-07-09 18:57) [9]


> sniknik © (09.07.03 18:11)

Да, но есть один трабл, это всё при выполнении какой-либо операции с базой, а мне просто описание всех ожибок нужно.
И чтоб работало только на тех машинах, на которых BDE стоит.
Просто нужно по коду вводимой ошибки описалово давалось, при отсуцтвии операции с какой либо БД, просто вскрывался BDE и оттуда тянулиьс ерроры...
Как бы так извратиться?


 
sniknik   (2003-07-09 22:25) [10]

изучи код внимательней :о), это и есть извращение которое будет давать message от номера введенной ошибки. и именно только где BDE установлен, где его нет уже Query1.Open вернет ишибку. впрочем Query не обязателен можно Table и что угодно в нем открыть (инициализацию BDE сделать), хоть текстовый файл с описанием сей "крутой" проги.


 
IronHawk   (2003-07-10 12:20) [11]


> sniknik © (09.07.03 22:25)

Ну, типа, работает, спасибо.
Осталосье ещё сваять так, чтоб при старте можно было в СомбоБоксе выбирать BDE алиас к какому коннектиться...


 
sniknik   (2003-07-10 12:42) [12]

надеюсь это не для вышеизложенного извращения? ;о)) (там просто незачем, указать путь вместо алиаса ...)

для других целей получить список для СомбоБокса не проблема, есть же GetAliasNames у сесии.


 
IronHawk   (2003-07-10 15:49) [13]


> sniknik © (10.07.03 12:42)

Мне надо алиалы вывести до сесии


 
sniknik   (2003-07-10 17:20) [14]

посмотри как она делает и делай также
procedure TSession.GetAliasNames(List: TStrings);
var
Cursor: HDBICur;
Desc: DBDesc;
begin
List.BeginUpdate;
try
List.Clear;
LockSession;
try
Check(DbiOpenDatabaseList(Cursor));
finally
UnlockSession;
end;
try
while DbiGetNextRecord(Cursor, dbiNOLOCK, @Desc, nil) = 0 do
begin
OemToChar(Desc.szName, Desc.szName);
List.Add(Desc.szName);
end;
finally
DbiCloseCursor(Cursor);
end;
finally
List.EndUpdate;
end;
end;


 
IronHawk   (2003-07-10 17:26) [15]


> sniknik © (10.07.03 17:20)

Какой юнит надо подрубить, чтоб заработали переменные:

var
Cursor: HDBICur;
Desc: DBDesc;


 
sniknik   (2003-07-10 18:29) [16]

самый главный ... BDE (и как ты без наго до сих пор? :о))


 
IronHawk   (2003-07-11 11:38) [17]


> sniknik © (10.07.03 18:29)

С ним, всё нормально, и с юнитами DB и DBTables тоже, но идёт ругня на HDBICur и DBDesc!


 
sniknik   (2003-07-11 11:55) [18]

не может быть, если все сним нормально то и типы должны видется.
видать без кода не обойтись. у тебя так?
uses BDE;

{$R *.dfm}

procedure TDMod.DataModuleCreate(Sender: TObject);
var
Cursor: HDBICur;
Desc: DBDesc;
....


 
IronHawk   (2003-07-11 12:16) [19]


> sniknik © (11.07.03 11:55)

Может, а следующим номером в регательстве компидятора идёт
LockSession и
UnlockSession
!


 
sniknik   (2003-07-11 12:32) [20]

слушай а оно тебе надо? ну нельзя же все буквально повторять/копировать.
открой модуль DBTables найди их там
и то и другое процедуры от сесии
procedure TSession.LockSession;
но ты же вроде от нее хочеш избавится, так зачем тебе ее блокировать? и создавать сначала... просто выкини их из процедуры.


 
IronHawk   (2003-07-11 13:02) [21]


> sniknik © (11.07.03 12:32)

Ну я их заремил и до компилятора...
просто было интересно, чего енто такое.


 
Anatoly Podgoretsky   (2003-07-17 07:53) [22]

Посмотри пример в {DELPHI}\Demos\Db\DbErrors



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

Форум: "Базы";
Текущий архив: 2003.08.07;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.009 c
14-20683
Карелин Артем
2003-07-23 10:01
2003.08.07
Лекарство от чумы 21 века.


14-20805
Феликс
2003-07-22 16:30
2003.08.07
Как же этот сайт называется?


1-20583
Aleksandr
2003-07-23 20:16
2003.08.07
Что за глюк с пропаданием Action в PopupMenu?


1-20502
___Nikolay
2003-07-25 13:46
2003.08.07
D: Projects PrepareTraffic ... akt_kenk.dll


14-20725
Димыч
2003-07-16 23:34
2003.08.07
Объектно-ориентированная технология





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский