Добрый день.
Возник вопрос. Есть программа которая должна работать и под YA и под FB. Как лучше определить, подключена ли база под FB и если подключена, то FB 2.1. или нет(используются компоненты IBX). Заранее спасибо.
Определить версию FB
-
- Сообщения: 12
- Зарегистрирован: 07 ноя 2007, 16:28
Да полно вариантов. Вот например первый попавшийся.
Код: Выделить всё
try
Q.SQL.Text = 'SELECT RDB$GET_CONTEXT(''SYSTEM'', ''ENGINE_VERSION'') FROM RDB$DATABASE';
Q.ExecQuery;
Result := Q.Fields[0].AsString;
except
// смотришь тип исключения, если "Function unknown. RDB$GET_CONTEXT", то раньше 2-ки или вообще InterBase,
// если "Context variable ENGINE_VERSION is not found in namespace SYSTEM", то 2.0.х
end;
-
- Сообщения: 12
- Зарегистрирован: 07 ноя 2007, 16:28
-
- Заслуженный разработчик
- Сообщения: 1436
- Зарегистрирован: 15 сен 2005, 09:05
Код: Выделить всё
type
tConnectServerInf = record
ConnectProtocol: TProtocol;
NameServer: string;
end;
......
function TDM.GetConnectServerInf(const DBName:string): tConnectServerInf;
// Получение из строки соединения БД имени сервера, на котором
// лежит БД и тип протокола соединения
var Idx1, Idx2: Integer;
Temp: string;
begin
Result.ConnectProtocol:= Local;
Result.NameServer:= 'LocalHost';
if Pos('\\', DBName) = 1 then begin
Temp := Copy(DBName, 3, Length(DBName));
Idx1 := PosCh('\', Temp);
if Idx1 <> 0 then begin
Result.ConnectProtocol:= NamedPipe;
Result.NameServer:= Copy(Temp, 1, Idx1 - 1);
end;
end else begin
Idx1 := PosCh(':', DBName);
if (Idx1 <> 0) and (Idx1 <> 2) then begin
Idx2 := Pos('@', DBName);
if Idx2 = 0 then begin
Result.NameServer:= copy(DBName, 1, Idx1 - 1);
log('Имя сервера: '+Result.NameServer);
Result.ConnectProtocol:= TCP;
log('Протокол TCP');
end else begin
Result.NameServer:= copy(DBName, 1, Idx2 - 1);
log('Имя сервера: '+Result.NameServer);
Result.ConnectProtocol:= SPX;
log('Протокол TCP');
end;
end;
end;
end;
function TDM.TestConnectServerFB(aDB: TpFIBDatabase): Boolean;
// Проверка возможности соединения с БД
const
cnstProtokolName: array [TProtocol] of string = ('TCP', 'SPX', 'NamedPipe', 'Local');
var
h: Cardinal;
buffer: array [0..MAX_PATH] of Char;
VerClient: string;
VerServer: string;
FI : TFileInfo;
begin
Result:= False;
//нужно ли проверять версию FB-сервера и клиента(fbClient.dll)
if not bCheckServer then begin
Result := true;
exit;
end;
h:= LoadLibrary(PAnsiChar(aDB.LibraryName));
if h = 0 then begin
Showmessage('Клиенская dll FB "'+aDB.LibraryName+'" не найдена');
Exit;
end;
GetModuleFileName(h, buffer, MAX_PATH);
FreeLibrary(h);
FI := fmMain.xGetExeFileInfo(buffer);
VerClient := fi.FileVersion;
with GetConnectServerInf(aDB.DBName) do begin
with TpFIBServerProperties.Create(nil) do try
LibraryName:= buffer;
LoginPrompt:= False;
Params.Add('user_name=' + aDB.ConnectParams.UserName);
Params.Add('password=' + aDB.ConnectParams.Password);
ServerName := NameServer;
Protocol := ConnectProtocol;
try
Active:= True;
except
on e: EFIBError do
begin
case e.IBErrorCode of
isc_network_error: begin
log('Сервер FB на компьюторе "'+ ServerName +'" не установлен или не запущен.'^M^J'Обратитесь к системному администратору.');
ShowMessage('Сервер FB на компьюторе "'+ ServerName +'" не установлен или не запущен.'^M^J'Обратитесь к системному администратору.');
Exit;
end;
isc_login : begin
log('Логин или пароль для сервера FireBird не верны.'^M^J'Обратитесь к системному администратору.'^M^J+Params.Text);
ShowMessage('Логин или пароль для сервера FireBird не верны.'^M^J'Обратитесь к системному администратору.'^M^J+Params.Text);
Exit;
end;
else//case
begin
log('Ошибка "'+IntToStr(e.IBErrorCode)+'" при попытке подключиться к серверу');
ShowMessage('Ошибка "'+IntToStr(e.IBErrorCode)+'" при попытке подключиться к серверу');
raise;
end;//case-else
end;//case
end;
else
raise;
end;
try
FetchVersionInfo;
VerServer:= VersionInfo.ServerVersion;
finally
Active:= False;
end;
finally
Free;
end;
end;
if pos(VerClient, VerServer) = 0 then begin
case MessageBox(Application.ActiveFormHandle, PAnsiChar('Версия клиенской библиотеки(fbClient.dll) отличается от версии сервера FireBird.'+#13+
'Версия клиента('+buffer+'): "'+VerClient +'"'+#13 +
'Версия сервера: "'+VerServer +'"'+#13 +
#13+
'Нажмите "ДА" для продолжения работы'+#13+
'Нажмите "НЕТ" для отмены подключения'+#13), 'Внимание', MB_ICONWARNING or MB_YESNO) of
ID_YES:begin
Result := True;
end;
ID_NO:begin
exit;
end;
end;//case
end;
Result:= True;
end;