-
Здравствуйте, уважаемые. Не поделитесь ли мнение, о том, как из программы узнать версию установленной FireBird?
-
-
А то что FireBird может быть более одного не волнует?
-
Нет кол-во установленных не интересует, предположем, что мне заранее известно о том, что он один...
-
Может быть ньюанс, что его рядышком с твоей программой в виде Embeded варианта положат...
-
> Может быть ньюанс, что его рядышком с твоей программой в > виде Embeded варианта положат...
ConnectionString-то разные будут. А вообще вопрос несколько странный. По-идее, ты должен в требованиях к программе указать: "Версия сервера не ниже ххх". И уже дальше в рамках базы использовать возможности именно этой версии, не выше и не ниже.
-
> Rouse_ © (05.10.11 14:39) [4] > Может быть ньюанс, что его рядышком с твоей программой в > виде Embeded варианта положат...
Да, да.. все возможно.... Возможно, что он вааапще не установлен, но все же, узнать такую инфу реально или нет... может быть какой-то "пунктик" в реестре есть... или в библиотеке fbclient.dll функция какая-ть есть.. иль ещё какое-ть чудо-юдо??
-
> ConnectionString-то разные будут.
а при чем тут это? В системе стоит например второй FB, рядом с программой лежит FB 1.5 Embeded, толку с того что определится наличие второго, если работа будет вестись с Embeded вариантом, чья библиотека будет подгружена первой?
-
> В системе стоит например второй FB, рядом с программой лежит > FB 1.5 Embeded, толку с того что определится наличие второго, > если работа будет вестись с Embeded вариантом, чья библиотека > будет подгружена первой?
Вот я тут как раз у Жеки уточнил. Если использовать IBx-компоненты, то будет подгружена библиотека 'gds23dll'. Т.е. её поиск будет вестись по стандартным правилам - сначала рядом с exe и т.д. Но, насколько я понял из его объяснения, она будет использоваться как клиентская часть, но совсем не факт, что как серверная, это уже зависит от ConnectionString. Далее. Я совершенно не обязан использовать IBx компоненты с их провайдером, я ведь могу взять ODBC-провайдер или OLEDB-провайдер. И тут уже, вроде как, всё исключительно через ConnectionString задаётся, хоть 10 версий Embedded рядом положи.
З.Ы. Попробую дома потестить.
-
> Да, да.. все возможно.... Возможно, что он вааапще не установлен, > но все же, узнать такую инфу реально или нет... может быть > какой-то "пунктик" в реестре есть... или в библиотеке fbclient. > dll функция какая-ть есть.. иль ещё какое-ть чудо-юдо??
А нафига? Начинай с ней работать, если что не так, то exception вывалится.
-
> Но, насколько я понял из его объяснения, она будет использоваться > как клиентская часть, но совсем не факт, что как серверная
это клиент/сервер в одном флаконе, в этом и цимус...
-
> А нафига? Начинай с ней работать, если что не так, то exception > вывалится.
Эксцепшон - это само сабой разумеется, но тут может быть кривой(неправильный) SQL запрос скаже, а может быть такое, что старая версия FB не поддерживает некоторых ключевых слов, введенных в новой версии, при этом для новых версий SQL запрос будет правильным, т.о. чтобы избежать лишнего разбора полетов, проше может сразу сказать юзеру, что "у тя, мол, FB старый. Ну ка новый ставь скарее"...
-
Ну не получается по хорошему, поудем другим вариантом :) Даю намек: библиотека gds32.dll экспортирует функцию gds_version
-
> но тут может быть кривой(неправильный) SQL запрос скаже
1. ANSI-SQL - он и в Африке ANSI-SQL. Если всё будет по его правилам, то ничего страшного не произойдёт. 2. У тебя сама база не должна развернуться на сервере, ниже чем .... 3. Всё вышесказанное относится к стандартой связке База-Клиент, если ты пишешь что-то a-la IBExpert или PowerDesigner, то конечно нужно версию учитывать. Но опять-таки, ДО коннекта. Посмотри, как это тот же IBExpert делает.
-
TIBServerProperties - что мешает использовать компонент?
-
> 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.
-
> Не поделитесь ли мнение, о том, как из программы узнать > версию установленной FireBird?
Версию сервера можно узнать с помощью TIBDatabaseInfo.Version
> Возможно, что он вааапще не установлен, но все же, узнать > такую инфу реально или нет...
Если не установлен, то версию узнать нельзя.
-
Использовать какие-либо компонентоы, не хочется....
Экспортировал функцию "gds__version" запускаю, выполняю получаю результат "170393861", хм..... задумался я тут... что же значат эти магические цифры.. Имеется установленый FireBird 2.1
-
> Начиная с версии 2.0 можно выполнить запрос вида:SELECT > RDB$GET_CONTEXT('SYSTEM', 'ENGINE_VERSION ') FROM RDB$DATABASE
Этот вариант хороший, но мне хочется распознать версии < 2.0. Вариант: если выполнено, то посмотреть результат, а если не выполнена - выдавать сообщение об обновлении версии - не оч хороший, хочется чуть больше универсальности...
-
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;
-
Уважаемый PEAKTOP! Вы очень точно ответили на очень полезный вопрос, однако приведенный Вами запрос (копирую):
SELECT RDB$GET_CONTEXT('SYSTEM', 'ENGINE_VERSION ') FROM RDB$DATABASE
не работает, а вот этот:
SELECT RDB$GET_CONTEXT('SYSTEM', 'ENGINE_VERSION') FROM RDB$DATABASE
работает!
-
Уважаемый PEAKTOP! Вы очень точно ответили на очень полезный вопрос, однако приведенный Вами запрос (копирую):
SELECT RDB$GET_CONTEXT('SYSTEM', 'ENGINE_VERSION ') FROM RDB$DATABASE
не работает, а вот этот:
SELECT RDB$GET_CONTEXT('SYSTEM', 'ENGINE_VERSION') FROM RDB$DATABASE
работает!
-
Извините за повтор.
-
Для работы FireDac необходимо указать расположение fbclient.dll. В зависимости от версии Firebird и самой OC - путь разный. Получается, чтобы запустить запрос необходимо настроить ConnectionString. А чтобы настроить ConnectionString надо знать расположение fbclient.dll. Замкнутый круг получается.
PS: Меня волнует не версия сервера (хотя и это важно), а расположение библиотеки fbclient.dll.
Заранее спасибо.
-
немного мытарства и вот родил сие чудо:
...
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;
-
если облагородить будет выглядеть вот так: ...
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
Else
End;
|