Страница 1 из 1

FB 2.0.3 Падает

Добавлено: 21 мар 2008, 12:37
armagedon2007
Для чтения из базы исполюзую транзакцию
read
read_committed
rec_version
Для записи
write
consistency
В 1.5 все работает, в 2.х падает сервер

Не удается найти описание для идентификатора события 281 из источника FirebirdGuardianDefaultInstance. Вызывающий данное событие компонент не установлен на этом локальном компьютере или поврежден. Установите или восстановите компонент на локальном компьютере.

Если событие возникло на другом компьютере, возможно, потребуется сохранить отображаемые сведения вместе с событием.

К событию были добавлены следующие сведения:

Abnormal Termination: C:\Program Files\Firebird\Firebird_2_0\bin\fbserver.exe: terminated abnormally (4294967295)

И сообщение об ошибке об ошибке Error reading data from the connection потом Error writing to the connection, после с этой таблицы ничего не читается.
Как быть?

Добавлено: 21 мар 2008, 12:46
kdv
надо постараться идентифицировать место, где происходит ошибка. если при чтении таблицы, значит база битая.

Добавлено: 21 мар 2008, 13:11
armagedon2007
kdv писал(а):надо постараться идентифицировать место, где происходит ошибка. если при чтении таблицы, значит база битая.
После записи нельзя прочитать из ПО даже если сервер рестартануть,
но при этом IBExpert все читает. Базу создал новую залил все данные через IBExpert и тоже самое.
Запись при этом в таблице существует, но прочитать ее из ПО никак.
Выдает выше указанную ощибку

Добавлено: 21 мар 2008, 13:23
Merlin
УДФ

Добавлено: 21 мар 2008, 13:27
hvlad
Читаем firebird.log, вслух

Добавлено: 21 мар 2008, 13:32
armagedon2007
Merlin писал(а):УДФ
Ну есть такое дело.
В чем там проблема?

Добавлено: 21 мар 2008, 13:33
armagedon2007
hvlad писал(а):Читаем firebird.log, вслух
The user defined function: ROUNDTO
referencing entrypoint: RoundTo
in module: UdfRest
caused the fatal exception: Access violation.
The code attempted to access a virtual
address without privilege to do so.
This exception will cause the Firebird server
to terminate abnormally.

Добавлено: 21 мар 2008, 13:42
kdv
вот и причина. а "работает в 1.5, а в 2.03 не работает" - значит, скорее всего, выделяет память через malloc, а не так как положено. Т.е. автор udf не читал faq на ibase.ru :)

Добавлено: 21 мар 2008, 13:50
armagedon2007
kdv писал(а):вот и причина. а "работает в 1.5, а в 2.03 не работает" - значит, скорее всего, выделяет память через malloc, а не так как положено. Т.е. автор udf не читал faq на ibase.ru :)
Тоесть тут чтото не так?

Код: Выделить всё

function RoundTo(var Value: Double; var Digits: Integer):PDouble; cdecl; export;
begin
  SetRoundMode(rmNearest);
  Value := Math.RoundTo(Value, Digits);
  Result := @Value;
end;

Добавлено: 21 мар 2008, 14:01
WildSery
Зачем на выходе PDouble? Как процедура в БД объявлена?

Добавлено: 21 мар 2008, 14:04
armagedon2007
WildSery писал(а):Зачем на выходе PDouble? Как процедура в БД объявлена?
Почемуто без PDouble в 1.5 не так работало.

Код: Выделить всё

DECLARE EXTERNAL FUNCTION ROUNDTO
    DOUBLE PRECISION,
    INTEGER
RETURNS DOUBLE PRECISION FREE_IT
ENTRY_POINT 'RoundTo' MODULE_NAME 'UdfRest';

Добавлено: 21 мар 2008, 14:53
WildSery
Что "FREE IT"? Ты выделял память под переменную?
Возвращай как все люди, BY VALUE, и возврат соответственно просто DOUBLE в коде.

Hint: Срочно читать статью. Даже если уже "смотрел".

Добавлено: 21 мар 2008, 15:34
armagedon2007
WildSery писал(а):Hint: Срочно читать статью. Даже если уже "смотрел".
Прочитай лучше сам и скажи вчем отличее того, что я написал от того, что во втором примере указано? Или статья устарела для FB 2.x
Переделал все заработало.
Спасибо.

Добавлено: 21 мар 2008, 16:15
WildSery
Отличие в строке
Как научиться писать UDF для InterBase за 21 мин. писал(а):!!!Числовые переменные не рекомендуется возвращать by reference (по ссылке) или указывать для них FREE_IT. Возвращать числовые типы данных можно только by value (по значению).
:wink:

Добавлено: 21 мар 2008, 16:18
armagedon2007
WildSery писал(а):Отличие в строке
Как научиться писать UDF для InterBase за 21 мин. писал(а):!!!Числовые переменные не рекомендуется возвращать by reference (по ссылке) или указывать для них FREE_IT. Возвращать числовые типы данных можно только by value (по значению).
:wink:
Это я читать умею. А в примере как написано?

Код: Выделить всё

function Add_B2(var iSmall: SmallInt; var iLong: Integer): PInteger; cdecl; export; 
//              ^^^                   ^^^                  ^^^^^^^^ 
//              by reference          by reference         by reference 
begin 
  iLong := iSmall + iLong; 
  Result := @iLong; 
end; 

Добавлено: 21 мар 2008, 16:24
WildSery
armagedon2007 писал(а):Это я читать умею. А в примере как написано?
Ну а сразу за примером, его объяснение? ;)
Или то, что FREE_IT это отдельный способ, не просто возврат по ссылке...

Мысли про себя ... и почему сразу на второй пример потянуло?

Добавлено: 21 мар 2008, 16:42
hvlad
armagedon2007 писал(а):Это я читать умею. А в примере как написано?
Где там хоть слово про FREE_IT ???

Добавлено: 24 мар 2008, 08:57
kdv
как читали по диагонали, так и будут. и FREE_IT к числовым типам лепят. Видать, поколение нынче такое...