Конференция "Базы" » Версия FireBird [D7]
 
  • PonosetcDM © (05.10.11 13:31) [0]
    Здравствуйте, уважаемые.
     Не поделитесь ли мнение, о том, как из программы узнать версию установленной FireBird?
  • Ega23 © (05.10.11 13:42) [1]
  • Anatoly Podgoretsky © (05.10.11 14:18) [2]
    А то что FireBird может быть более одного не волнует?
  • PonosetcDM © (05.10.11 14:29) [3]
    Нет кол-во установленных не интересует, предположем, что мне заранее известно о том, что он один...
  • Rouse_ © (05.10.11 14:39) [4]
    Может быть ньюанс, что его рядышком с твоей программой в виде Embeded варианта положат...
  • Ega23 © (05.10.11 14:48) [5]

    > Может быть ньюанс, что его рядышком с твоей программой в
    > виде Embeded варианта положат...


    ConnectionString-то разные будут.
    А вообще вопрос несколько странный. По-идее, ты должен в требованиях к программе указать: "Версия сервера не ниже ххх". И уже дальше в рамках базы использовать возможности именно этой версии, не выше и не ниже.
  • PonosetcDM © (05.10.11 14:50) [6]

    > Rouse_ ©   (05.10.11 14:39) [4]
    > Может быть ньюанс, что его рядышком с твоей программой в
    > виде Embeded варианта положат...

    Да, да.. все возможно.... Возможно, что он вааапще не установлен, но все же, узнать такую инфу реально или нет... может быть какой-то "пунктик" в реестре есть... или в библиотеке fbclient.dll функция какая-ть есть.. иль ещё какое-ть чудо-юдо??
  • Rouse_ © (05.10.11 14:51) [7]

    > ConnectionString-то разные будут.

    а при чем тут это?
    В системе стоит например второй FB, рядом с программой лежит FB 1.5 Embeded, толку с того что определится наличие второго, если работа будет вестись с Embeded вариантом, чья библиотека будет подгружена первой?
  • Ega23 © (05.10.11 14:57) [8]

    > В системе стоит например второй FB, рядом с программой лежит
    > FB 1.5 Embeded, толку с того что определится наличие второго,
    >  если работа будет вестись с Embeded вариантом, чья библиотека
    > будет подгружена первой?


    Вот я тут как раз у Жеки уточнил. Если использовать IBx-компоненты, то будет подгружена библиотека 'gds23dll'. Т.е. её поиск будет вестись по стандартным правилам - сначала рядом с exe и т.д.
    Но, насколько я понял из его объяснения, она будет использоваться как клиентская часть, но совсем не факт, что как серверная, это уже зависит от ConnectionString.
    Далее. Я совершенно не обязан использовать IBx компоненты с их провайдером, я ведь могу взять ODBC-провайдер или OLEDB-провайдер. И тут уже, вроде как, всё исключительно через ConnectionString задаётся, хоть 10 версий Embedded рядом положи.

    З.Ы. Попробую дома потестить.
  • Ega23 © (05.10.11 14:59) [9]

    > Да, да.. все возможно.... Возможно, что он вааапще не установлен,
    >  но все же, узнать такую инфу реально или нет... может быть
    > какой-то "пунктик" в реестре есть... или в библиотеке fbclient.
    > dll функция какая-ть есть.. иль ещё какое-ть чудо-юдо??


    А нафига? Начинай с ней работать, если что не так, то exception вывалится.
  • Rouse_ © (05.10.11 15:27) [10]

    > Но, насколько я понял из его объяснения, она будет использоваться
    > как клиентская часть, но совсем не факт, что как серверная

    это клиент/сервер в одном флаконе, в этом и цимус...
  • PonosetcDM © (05.10.11 16:21) [11]

    > А нафига? Начинай с ней работать, если что не так, то exception
    > вывалится.

    Эксцепшон - это само сабой разумеется, но тут может быть кривой(неправильный) SQL запрос скаже, а может быть такое, что старая версия FB не поддерживает некоторых ключевых слов, введенных в новой версии, при этом для новых версий SQL запрос будет правильным, т.о. чтобы избежать лишнего разбора полетов, проше может сразу сказать юзеру, что "у тя, мол, FB старый. Ну ка новый ставь скарее"...
  • Rouse_ © (05.10.11 16:35) [12]
    Ну не получается по хорошему, поудем другим вариантом :)
    Даю намек: библиотека gds32.dll экспортирует функцию gds_version
  • Ega23 © (05.10.11 16:51) [13]

    > но тут может быть кривой(неправильный) SQL запрос скаже


    1. ANSI-SQL - он и в Африке ANSI-SQL. Если всё будет по его правилам, то ничего страшного не произойдёт.
    2. У тебя сама база не должна развернуться на сервере, ниже чем ....
    3. Всё вышесказанное относится к стандартой связке База-Клиент, если ты пишешь что-то a-la IBExpert или PowerDesigner, то конечно нужно версию учитывать. Но опять-таки, ДО коннекта. Посмотри, как это тот же IBExpert делает.
  • wisekaa © (05.10.11 23:32) [14]
    TIBServerProperties - что мешает использовать компонент?
  • PEAKTOP © (06.10.11 16:35) [15]
    > PonosetcDM ©   (05.10.11 13:31)
    >  Не поделитесь ли мнение, о том, как из программы узнать версию установленной FireBird?


    Начиная с версии 2.0 можно выполнить запрос вида:

    SELECT RDB$GET_CONTEXT('SYSTEM', 'ENGINE_VERSION ') FROM RDB$DATABASE



    читать тут: http://firebirdsql.su/doku.php?id=rdb_get_context

    Для релизов старше версии 2.0 этот способ считается разработчиками единственно правильным в виду поддержки движком старых клиентов gds32.dll/so даже от InterBase 6.0.
  • Loginov Dmitry © (07.10.11 00:32) [16]

    > Не поделитесь ли мнение, о том, как из программы узнать
    > версию установленной FireBird?


    Версию сервера можно узнать с помощью TIBDatabaseInfo.Version


    > Возможно, что он вааапще не установлен, но все же, узнать
    > такую инфу реально или нет...


    Если не установлен, то версию узнать нельзя.
  • PonosetcDM © (07.10.11 15:36) [17]
    Использовать какие-либо компонентоы, не хочется....

    Экспортировал функцию "gds__version" запускаю, выполняю получаю результат "170393861", хм..... задумался я тут... что же значат эти магические цифры.. Имеется установленый FireBird 2.1
  • PonosetcDM © (07.10.11 15:38) [18]

    > Начиная с версии 2.0 можно выполнить запрос вида:SELECT
    > RDB$GET_CONTEXT('SYSTEM', 'ENGINE_VERSION ') FROM RDB$DATABASE

    Этот вариант хороший, но мне хочется распознать версии < 2.0. Вариант: если выполнено, то посмотреть результат, а если не выполнена - выдавать сообщение об обновлении версии - не оч хороший, хочется чуть больше универсальности...
  • Cobalt © (07.10.11 15:58) [19]
    function TIBDatabaseInfo.GetVersion: AnsiString;
    var
     local_buffer: array[0..IBBigLocalBufferLength - 1] of AnsiChar;
     DatabaseInfoCommand: AnsiChar;
    begin
     DatabaseInfoCommand := AnsiChar(isc_info_version);
     Call(FGDSLibrary.isc_database_info(StatusVector, @FDatabase.Handle, 1, @DatabaseInfoCommand,
                           IBBigLocalBufferLength, local_buffer), True);
     local_buffer[5 + Int(local_buffer[4])] := #0;
     result := AnsiString(PAnsiChar(@local_buffer[5]));
    end;

  • apopury (18.06.13 13:16) [20]
    Уважаемый PEAKTOP! Вы очень точно ответили на очень полезный вопрос, однако приведенный Вами запрос (копирую):

    SELECT RDB$GET_CONTEXT('SYSTEM', 'ENGINE_VERSION ') FROM RDB$DATABASE

    не работает, а вот этот:

    SELECT RDB$GET_CONTEXT('SYSTEM', 'ENGINE_VERSION') FROM RDB$DATABASE

    работает!
  • apopury (18.06.13 13:17) [21]
    Уважаемый PEAKTOP! Вы очень точно ответили на очень полезный вопрос, однако приведенный Вами запрос (копирую):

    SELECT RDB$GET_CONTEXT('SYSTEM', 'ENGINE_VERSION ') FROM RDB$DATABASE

    не работает, а вот этот:

    SELECT RDB$GET_CONTEXT('SYSTEM', 'ENGINE_VERSION') FROM RDB$DATABASE

    работает!
  • apopury (18.06.13 13:19) [22]
    Извините за повтор.
  • Артем (02.07.13 12:51) [23]
    Для работы FireDac необходимо указать расположение fbclient.dll.
    В зависимости от версии Firebird и самой OC - путь разный.
    Получается, чтобы запустить запрос необходимо настроить  ConnectionString.
    А чтобы настроить ConnectionString надо знать расположение fbclient.dll. Замкнутый круг получается.

    PS: Меня волнует не версия сервера (хотя и это важно), а расположение библиотеки fbclient.dll.

    Заранее спасибо.
  • Артем (02.07.13 14:16) [24]
    немного мытарства и вот родил сие чудо:

    ...
    Uses Registry, Windows;
    ...

     Reg := TRegistry.Create;
     try
       REG.RootKey := HKEY_LOCAL_MACHINE;
       if Reg.KeyExists('SOFTWARE\Firebird Project\Firebird Server\Instances') then  begin
         if reg.OpenKey('SOFTWARE\Firebird Project\Firebird Server\Instances', False) then
           MessageDlg('Зер гуд!!! ' + reg.ReadString('DefaultInstance'),
             TMsgDlgType.mtInformation,[TMsgDlgBtn.mbOK], 0);
       end
       Else
         MessageDlg('Серверайтенг обломайтунг!!!',
           TMsgDlgType.mtInformation,[TMsgDlgBtn.mbOK], 0);
     finally
       Reg.Free;
     end;

  • Артем (02.07.13 15:33) [25]
    если облагородить будет выглядеть вот так:
    ...
    Uses Registry, Windows;
    ...

    Function GetPathFBclient: TFileName;
    Var
     Reg: TRegistry;
    Begin
     Result := '';
     Reg := TRegistry.Create;
     try
       REG.RootKey := HKEY_LOCAL_MACHINE;
       if Reg.KeyExists('SOFTWARE\Firebird Project\Firebird Server\Instances') then
         if reg.OpenKeyReadOnly('SOFTWARE\Firebird Project\Firebird Server\Instances') then
           Result := reg.ReadString('DefaultInstance') + 'bin\fbclient.dll';
     finally
       Reg.Free;
     end;
    End;



    Пример использования:
    Var
      V: TFileName;
    Begin
      V := GetPathFBclient;
      If V <> '' then
        {Сервер вроде как утстановлен согласно реестру, а Библиотека fbclient.dll находиться -> V}
     Else
       {Сервер не установлен вовсе}
    End;

 
Конференция "Базы" » Версия FireBird [D7]
Есть новые Нет новых   [119684   +130][b:0][p:0.002]