Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
 Re: Ошибка при работе с компонентами interbase  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 2099
Гость1234
YuRock, Guest7777 - а может дадите ссылки, где мне почитать о ваших решениях, чтобы и у меня работало как часы?

Одно из костыльных решений
procedure TfrmMain.OnAppException(Sender: TObject; E: Exception);
begin
  if E is EIBError then begin
    Log( 'Ошибка базы данных: ' + E.Message, 1 );
    if IsCriticalIBError( ( E as EIBError ).IBErrorCode ) then
      ReconnectAllOnCriticalDBError;
  end else
    Log( 'Неопределенная ошибка: ' + E.Message, 1 );
end;

ф-ция IsCriticalIBError выглядит примерно так:
+
function IsCriticalIBError( iscErrorCode: Integer ): Boolean;
const
  MAX_IBCRITICAL_ERROR = 14;
  anIBCriticalErrors: Array[ 1..MAX_IBCRITICAL_ERROR ] of Integer = (
    isc_lost_db_connection,
    isc_net_init_error,
    isc_network_error,
    isc_net_connect_err,
    isc_net_connect_listen_err,
    isc_net_event_connect_err,
    isc_net_event_listen_err,
    isc_net_read_err,
    isc_net_write_err,
    isc_io_create_err,
    isc_io_open_err,
    isc_io_close_err,
    isc_io_read_err,
    isc_io_write_err
  );
var
  i: Integer;
begin
  for i := 1 to MAX_IBCRITICAL_ERROR do if iscErrorCode = anIBCriticalErrors[ i ] then begin
    Result := True;
    Exit;
  end;

  Result := False;
end;

в ReconnectAllOnCriticalDBError делаешь
if db.Connected then
  db.ForceClose;

db.Connected := True;

// И со своими препарированными запросы надо Unprepare/Prepare;
// И свои открытые датасеты надо переоткрыть
// (для чего, естественно, транзакцию опаять стартовать)
26 сен 17, 11:36    [20823199]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при работе с компонентами interbase  [new]
чччД
Guest
Гость1234
Вашему вниманию текущая проба решить проблему

Говно какое-то.
А почему ты не делаешь то, что я тебе говорил? 20821298
26 сен 17, 11:45    [20823251]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при работе с компонентами interbase  [new]
Гость1234
Guest
YuRock

В данном случае, если я правильно понял, ты просто запускаешь свой обработчик поиска ошибки, и потом, запускаешь

if db.Connected then
  db.ForceClose;

db.Connected := True;

я видать уже совсем дымлюсь, но ошибка уже есть и у меня уже проходит коннект по новой, и транзакция по новой запускается, но как только я обращаюсь к ibquery, мне выдает "Dataset open", хотя я его и фалзил, и слозил...

чччД

Так то это и есть минимальное приложение, повторяющее проблему...

Я запускаю приложение, нажимаю BitBtn1 - вижу нормальное открытие, затем в панели инструментов останавливаю и запускаю по новой Службу FireBird и нажимаю Button2....
26 сен 17, 12:53    [20823523]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при работе с компонентами interbase  [new]
чччД
Guest
Гость1234
...
чччД

Так то это и есть минимальное приложение, повторяющее проблему...
...

Ну вот сам его с листа и компилируй, и ошибку сам ищи.
26 сен 17, 13:00    [20823562]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при работе с компонентами interbase  [new]
Док
Member

Откуда: Казань
Сообщений: 5033
Гость1234,

дык, тебе что надо-то в итоге? Датасет открыть? Или написать чего-то?
26 сен 17, 13:13    [20823616]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при работе с компонентами interbase  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 2099
Гость1234
ты просто запускаешь свой обработчик поиска ошибки

Нет, я устанавливаю общий обработчик необработанных исключений Application.OnException := OnAppException.


Гость1234
но как только я обращаюсь к ibquery, мне выдает "Dataset open", хотя я его и фалзил, и слозил

Не знаю, что такое "фалзил, и слозил". Его надо на всякий сделать Dataset.Active := False; Dataset.Active := True; и думаю должно заработать. Если нет - установить в какой строке ошибка и исправлять её.
26 сен 17, 13:21    [20823637]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при работе с компонентами interbase  [new]
Гость1234
Guest
чччД

Что сделать? Приложить архив папки с исходниками? могу...

Док

я хочу после проблем с сервером переоткрыть 3 компоненты IBdatabase, IBTrasaction и IBQuery...

К сообщению приложен файл (ClosBas.7z - 7Kb) cкачать
26 сен 17, 13:23    [20823653]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при работе с компонентами interbase  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 2099
Гость1234
я хочу после проблем с сервером переоткрыть

А если не получится переоткрыть, что ты собираешься делать?
26 сен 17, 13:25    [20823659]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при работе с компонентами interbase  [new]
чччД
Guest
Гость1234
чччД

Что сделать? Приложить архив папки с исходниками? могу...

Док

я хочу после проблем с сервером переоткрыть 3 компоненты IBdatabase, IBTrasaction и IBQuery...

Не, трэш у тебя там какой-то.

Почитай: http://www.ibase.ru/ibx/
26 сен 17, 13:28    [20823672]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при работе с компонентами interbase  [new]
Гость1234
Guest
YuRock

ну вот и не получается этот Dataset переоткрыть. У меня его даже удалить не получается ...

Что буду делать - дерево трясти (из анекдота)
26 сен 17, 13:30    [20823677]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при работе с компонентами interbase  [new]
Док
Member

Откуда: Казань
Сообщений: 5033
Гость1234,

+ сделано на Лазаре, но в дельфях то же самое
procedure TForm1.Button1Click(Sender: TObject);
const
  DBPath: String = 'localhost/3302:d:\temp\Employee.fdb';
  ChrSet: String = 'UTF8';
  LibName: String = 'd:\Portable_program\Firebird_server\Firebird_3_0_2\fbclient.dll';
  UsrNm: String = 'sysdba';
  PW: String = 'cooladmin';
var
  Dbase: TIBDataBase;
  ReadTrans: TIBTransaction;
  Qry: TIBQuery;
  DS: TDataSource;
begin
  Dbase:= TIBDataBase.Create(Application);
  ReadTrans:= TIBTransaction.Create(Application);
  Qry:= TIBQuery.Create(Application);
  DS:= TDataSource.Create(Application);
  try
    with Dbase do
    begin
      DatabaseName:= DBPath;
      DefaultTransaction:= ReadTrans;
      LoginPrompt:= False;
      LibraryName:= LibName;
      Params.Add('lc_ctype=' + ChrSet);
      Params.Add('user_name=' + UsrNm);
      Params.Add('password=' + PW);
    end;

    with ReadTrans do
    begin
      Params.Add('read');
      Params.Add('read_committed');
      Params.Add('rec_version');
      Params.Add('nowait');
      DefaultDatabase:= Dbase;
    end;

    with Qry do
    begin
      Database:= Dbase;
      Transaction:= ReadTrans;
      AutoFetchAll:= True;
      SQL.Text:= 'SELECT COUNTRY, CURRENCY FROM COUNTRY';
    end;

    DS.DataSet:= Qry;
    DBGrid1.DataSource:= DS;

    try
      if not Dbase.Connected then Dbase.Connected:= True;
      try
        ReadTrans.Active:= True;
        try
          Qry.Active:= True;
        except
          on E:EIBError do //uses IB
          begin
            ShowMessage(E.Message);
            Exit;
          end;
        end;
      except
        on E:EIBError do
        begin
          ShowMessage(E.Message);
          Exit;
        end;
      end;
    except
      on E:EIBError do
      begin
        ShowMessage(E.Message);
        Exit;
      end;
    end;

    ShowMessage('Connected!');
  finally
    FreeAndNil(DS);
    FreeAndNil(Qry);
    FreeAndNil(ReadTrans);
    FreeAndNil(Dbase);
  end;
end;                                      


К сообщению приложен файл. Размер - 22Kb
26 сен 17, 13:52    [20823783]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при работе с компонентами interbase  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 2099
Гость1234
ну вот и не получается этот Dataset переоткрыть

Не понимаю тогда, как у меня за минуту получилось тестовый пример сделать, в котором всё получилось.

К сообщению приложен файл (Test.7z - 3Kb) cкачать
26 сен 17, 13:57    [20823812]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при работе с компонентами interbase  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 2099
Док
сделано на Лазаре, но в дельфях то же самое

О, а давно в IBX появилась возможность писать
Dbase.LibraryName:= LibName;

?
26 сен 17, 14:00    [20823820]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при работе с компонентами interbase  [new]
Гость1234
Guest
Док

Проблемы создать, соединиться и после работы удалить нет.
В твоем случае попробуй, пожалуйста, во время коннекта остановить и запустить сервер и не удаляй созданные компоненты, а переконектись ими к базе по новой...
26 сен 17, 14:44    [20824022]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при работе с компонентами interbase  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 9756
YuRock
О, а давно в IBX появилась возможность писать
В ХЕ3 (IBX 17.17) LibraryName нет, но есть ServerType. Суть - зерегистрированный список строк. К каждой строке привязана своя реализация IGDSLibrary. В этой реализации можно менять клиентскую библиотеку
26 сен 17, 14:44    [20824026]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при работе с компонентами interbase  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 2099
Гость1234
остановить и запустить сервер и не удаляй созданные компоненты, а переконектись ими к базе по новой

Ты хочешь то, что в моём примере делает нажатие кнопки ReOpenQuery после перезапуска службы сервера?
26 сен 17, 15:04    [20824139]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при работе с компонентами interbase  [new]
Док
Member

Откуда: Казань
Сообщений: 5033
YuRock
Док
сделано на Лазаре, но в дельфях то же самое

О, а давно в IBX появилась возможность писать
Dbase.LibraryName:= LibName;


?

Я форк юзаю от -Rik- а-ля фибы.
26 сен 17, 15:26    [20824224]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при работе с компонентами interbase  [new]
Гость1234
Guest
YuRock,

Да срабатывает, но почему то у меня после двойного нажатия на ReOpenQuery )))

В любом случае прикольно - спасибо)) Попробую разобраться со своим хозяйством ))
26 сен 17, 15:32    [20824248]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при работе с компонентами interbase  [new]
Док
Member

Откуда: Казань
Сообщений: 5033
Гость1234
В твоем случае попробуй, пожалуйста, во время коннекта остановить и запустить сервер и не удаляй созданные компоненты, а переконектись ими к базе по новой...

Я потому и спрашивал, чего тебе надо, так как ты внятно не можешь объяснить суть проблемы.
26 сен 17, 15:33    [20824251]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при работе с компонентами interbase  [new]
Guest7777
Guest
_Vasilisk_
YuRock
О, а давно в IBX появилась возможность писать
В ХЕ3 (IBX 17.17) LibraryName нет, но есть ServerType. Суть - зерегистрированный список строк. К каждой строке привязана своя реализация IGDSLibrary. В этой реализации можно менять клиентскую библиотеку

А сам-то реально пробовал таким макаром привязать к IBX что-то фаербердовское, а не интербейзовское или пока что чисто теоретические построения?
26 сен 17, 15:35    [20824262]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при работе с компонентами interbase  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 9756
Guest7777
А сам-то реально пробовал таким макаром привязать к IBX что-то фаербердовское
Да. Именно таким макаром привязал FB и FBEmbedded. Единственный минус - Эмбаркадера засунула свою реализацию IGDSLibrary в implementation. Поэтому вместо простого наследования пришлось копировать всю реализацию
26 сен 17, 15:59    [20824348]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при работе с компонентами interbase  [new]
Guest7777
Guest
_Vasilisk_,

т.е. в свойстве ServerType после этого появилась пара новых позиций, соответствующих FB и соотв. образом функциональных?
26 сен 17, 16:27    [20824441]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при работе с компонентами interbase  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 9756
Guest7777
т.е. в свойстве ServerType после этого появилась пара новых позиций, соответствующих FB
Да
Guest7777
и соотв. образом функциональных?
С этим сложнее. Т.к. мне кроме выбора библиотеки ничего больше не было нужно. Т.е. я скопировал реализацию IGDSLibrary для IB и просто заменил библиотеку. Никаких особых FB-фич мне не требовалось. А так да - я выбираю ServerType и гружу нужного мне клиента.
26 сен 17, 17:02    [20824536]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при работе с компонентами interbase  [new]
Guest7777
Guest
_Vasilisk_,

Понял, учту. Ибо сам под XE5 счел необходимым править непосредственно исходники IBX для достижения примерно того же функционала, не найдя с наскоку способа сделать это по-человечески надстройкой сверху. Хотя тоже действовал через дополнительную реализацию IGDSLibrary.
26 сен 17, 17:19    [20824608]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при работе с компонентами interbase  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 9756
Guest7777,

Дарю 20543220
26 сен 17, 17:40    [20824674]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Delphi Ответить