Определить версию FB

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
gsAlexander
Сообщения: 12
Зарегистрирован: 07 ноя 2007, 16:28

Определить версию FB

Сообщение gsAlexander » 09 ноя 2007, 11:49

Добрый день.
Возник вопрос. Есть программа которая должна работать и под YA и под FB. Как лучше определить, подключена ли база под FB и если подключена, то FB 2.1. или нет(используются компоненты IBX). Заранее спасибо.

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 09 ноя 2007, 12:05

Да полно вариантов. Вот например первый попавшийся.

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

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;

gsAlexander
Сообщения: 12
Зарегистрирован: 07 ноя 2007, 16:28

Сообщение gsAlexander » 09 ноя 2007, 12:22

Ну, так и я умею :D . Хотелось как по правильному.

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 09 ноя 2007, 16:28

isc_database_info() совместно с isc_info_implementation, isc_info_isc_version, isc_info_ods_version и т.д.

Akella
Сообщения: 95
Зарегистрирован: 13 дек 2005, 12:07

Сообщение Akella » 21 ноя 2007, 16:56

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

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;

Ответить