Как найти версию MS Access и/или имя dll, используемое для соединения FireDac?

У меня есть подключение FireDac к базе данных Microsoft Access. Я настраиваю Parms для соединения следующим образом:

Connection.Params.Add('DriverID=MSAcc');
Connection.Params.Add('Database=' + FDatabasePath);
Connection.Connected := true;

Вообще это прекрасно работает. Однако в некоторых случаях установлен старый драйвер MS Access. Мы хотели бы обнаружить эту ситуацию и предупредить пользователя, чтобы он мог установить новый драйвер.

Как я могу получить версию драйвера или, по крайней мере, имя VendorLib, которое FireDac нашел и использовал для установления соединения?

Я знаю, что могу указать VendorLib в ссылке физического соединения до открытия моего соединения. Я не хочу этого делать. Я хочу, чтобы FireDac выполнил процесс поиска и использования наиболее подходящего драйвера в системе. Однако, как только это будет сделано, я хотел бы знать, какой драйвер он использовал.

Я попытался создать TFDPhysMSAccessDriverLink после того, как соединение было открыто, надеясь, что будут установлены свойства ActualDriverId или VendorLib. Но ActualDriverId — это MsAcc, а VendorLib пуста.


person Mark Elder    schedule 22.02.2017    source источник


Ответы (1)


1. Получить версию драйвера

Вы можете получить версию драйвера в порядковой форме с помощью DriverVersion или в виде строки (которая может включать также описание драйвера) с помощью DRIVER_VER. Запрошенный SQL_DRIVER_VER тип информации в ODBC API описан следующим образом:

SQL_DRIVER_VER (ODBC 1.0)

Строка символов с версией драйвера и, необязательно, описанием драйвера. Как минимум, версия имеет форму ##.##.####, где первые две цифры — основная версия, следующие две цифры — дополнительная версия, а последние четыре цифры — версия выпуска.

С FireDAC вы можете сделать это следующим образом:

uses
  FireDAC.Phys.ODBCWrapper;

procedure TForm1.Button1Click(Sender: TObject);
var
  DriverVerStr: string;
  DriverVerInt: TFDVersion;
  ODBCConnection: TODBCConnection;
begin
  ODBCConnection := TObject(FDConnection.CliObj) as TODBCConnection;

  DriverVerStr := ODBCConnection.DRIVER_VER;
  DriverVerInt := ODBCConnection.DriverVersion;

  Memo.Lines.Add(Format('DriverVerStr: %s', [DriverVerStr]));
  Memo.Lines.Add(Format('DriverVerInt: %d', [DriverVerInt]));
end;

2. Получите версию ODBC, которую поддерживает драйвер.

Чтобы получить версию ODBC, поддерживаемую используемым драйвером, вы можете использовать < strong>DriverODBCVersion для получения порядкового значения или DRIVER_ODBC_VER, чтобы получить строковое значение. Запрошено SQL_DRIVER_ODBC_VER< /strong> информация о типе данных описывается так:

SQL_DRIVER_ODBC_VER (ODBC 2.0)

Строка символов с версией ODBC, поддерживаемой драйвером. Версия имеет вид ##.##, где первые две цифры — основная версия, а следующие две цифры — дополнительная версия. SQL_SPEC_MAJOR и SQL_SPEC_MINOR определяют основной и дополнительный номера версии. Для версии ODBC, описанной в данном руководстве, это 3 и 0, и драйвер должен вернуть «03.00».

С FireDAC вы можете сделать это следующим образом:

uses
  FireDAC.Phys.ODBCWrapper;

procedure TForm1.Button1Click(Sender: TObject);
var
  ODBCVerStr: string;
  ODBCVerInt: TFDVersion;
  ODBCConnection: TODBCConnection;
begin
  ODBCConnection := TObject(FDConnection.CliObj) as TODBCConnection;

  ODBCVerStr := ODBCConnection.DRIVER_ODBC_VER;
  ODBCVerInt := ODBCConnection.DriverODBCVersion;

  Memo.Lines.Add(Format('ODBCVerStr: %s', [ODBCVerStr]));
  Memo.Lines.Add(Format('ODBCVerInt: %d', [ODBCVerInt]));
end;

3. Получить версию продукта СУБД, к которой обращается драйвер

Доступную версию продукта СУБД можно получить с помощью DBMS_VER собственность. ODBC API описывает запрошенный < strong>SQL_DBMS_VER тип информации:

SQL_DBMS_VER (ODBC 1.0)

Строка символов, указывающая версию продукта СУБД, к которому обращается драйвер. Версия имеет форму ##.##.####, где первые две цифры — основная версия, следующие две цифры — дополнительная версия, а последние четыре цифры — версия выпуска. Драйвер должен отображать версию продукта СУБД в этой форме, но может также добавлять версию продукта СУБД. Например, «04.01.0000 руб. 4.1».

С FireDAC вы можете получить это таким образом (нет свойства, возвращающего проанализированный порядковый номер версии, поэтому давайте попробуем выполнить синтаксический анализ самостоятельно):

uses
  FireDAC.Stan.Util, FireDAC.Phys.ODBCWrapper;

procedure TForm1.Button1Click(Sender: TObject);
var
  DBMSVerStr: string;
  DBMSVerInt: TFDVersion;
  ODBCConnection: TODBCConnection;
begin
  ODBCConnection := TObject(FDConnection.CliObj) as TODBCConnection;

  DBMSVerStr := ODBCConnection.DBMS_VER;
  DBMSVerInt := FDVerStr2Int(DBMSVerStr);

  Memo.Lines.Add(Format('DBMSVerStr: %s', [DBMSVerStr]));
  Memo.Lines.Add(Format('DBMSVerInt: %d', [DBMSVerInt]));
end;

4. Получите информацию об унифицированной версии FireDAC

FireDAC предоставляет ClientVersion и ServerVersion свойства, доступные через ConnectionMetaDataIntf свойство интерфейса объекта соединения.

Для драйверов ODBC ClientVersion возвращает версию драйвера (описано в разделе 1 здесь), если драйвер не является одноуровневым драйвером, в противном случае — версию продукта СУБД (описано в разделе 3). ServerVersion возвращает всегда версия продукта СУБД (описана в разделе 3 здесь) для драйверов ODBC.

Например:

procedure TForm1.Button1Click(Sender: TObject);
var
  Metadata: IFDPhysConnectionMetadata;
begin
  Metadata := FDConnection.ConnectionMetaDataIntf;
  try
    Memo.Lines.Add(Format('ClientVersion: %d', [Metadata.ClientVersion]));
    Memo.Lines.Add(Format('ServerVersion: %d', [Metadata.ServerVersion]));
  finally
    Metadata := nil;
  end;
end;
person Victoria    schedule 26.06.2017
comment
Эти свойства, кажется, возвращают версию ODBC, которую реализует драйвер, а не версию самого драйвера. Прямо сейчас я вижу два драйвера в моем инструменте администратора ODBC для доступа. Одна версия 10.00.15063, другая 14.00.7010. Когда я запускаю ваш код в моем соединении, я получаю следующее: DRIVER_VER: механизм базы данных Microsoft Access DRIVER_ODBC_VER: 03.51 DriverVersion: 0 DriverODBCVersion: 351000000 - person Mark Elder; 28.06.2017
comment
Я надеялся, что DRIVER_VER будет версией CLI. По крайней мере должно быть. Этот DRIVER_ODBC_VER должен сообщать о поддерживаемой версии ODBC. Ну, плохо реализован SQL_DRIVER_VER тип информации в этом драйвере. В таком случае, хм, может быть, проверить версию библиотеки драйверов? - person Victoria; 28.06.2017
comment
Обновлено. Я попытался охватить информацию о версии, которая может вас заинтересовать. Думаю, вы ищете информацию о продукте СУБД (по крайней мере, в вашем заголовке написано Как я могу найти версию MS Access, извините, я пропустил это). Почему версия драйвера возвращает для вашего используемого драйвера что-то другое, чем указывает ODBC API, просто из-за неправильной реализации (если кто-то вместо Как минимум версия имеет вид ##.##.#### возвращает движок базы данных Access, комментировать не стоит :) - person Victoria; 28.06.2017
comment
Мне нужно будет удалить мои старые драйверы и проверить некоторые номера версий, чтобы увидеть, что изменилось. Но вы все же подсказали мне, куда двигаться. Из-за того, что возвращает Access, я собираюсь использовать свойство OdbcConnection.DRIVER_NAME. Это дает мне aceodbc.dll. Затем я могу прочитать номер версии из dll. Это дает мне версию, которую я ожидаю увидеть. Спасибо за подробный пост. - person Mark Elder; 28.06.2017
comment
Еще один вопрос: я не могу найти способ проверить, действительно ли FDConnection.CliObj является TODBCConnection. Я хотел бы добавить проверку вокруг этого приведения, но я не вижу, как FireDac отслеживает то, что у него есть. Все остальное, кажется, завернуто в интерфейсы, но я не могу получить доступ к DRIVER_NAME ни из одного из них. - person Mark Elder; 28.06.2017
comment
Это особенности драйвера. Для разных драйверов существуют разные объекты подключения со специфическими свойствами драйвера (например, объект командной строки PostgreSQL имеет только SERVER_VERSION (ServerVersion) свойств, связанных с управлением версиями). Так что вы можете, например. спросите, относится ли этот объект CLI is к определенному типу (не полагайтесь на тип СУБД, потому что может быть больше способов подключения к одной СУБД, и в этом случае объект CLI может отличаться, например, собственный или ODBC). Объекты CLI, которые вы не можете унифицировать. Позвольте мне проверить источник, есть ли единый способ получить полностью указанный путь к используемому физическому драйверу... - person Victoria; 28.06.2017
comment
Я не уделял должного внимания тому, что я делал. Я пытался использовать это на указателе. Мне нужно: если TObject(FDConnection.CliObj) - это TODBCConnection, то... Теперь отлично работает. Благодарю вас! - person Mark Elder; 28.06.2017
comment
Я расширил пост для получения информации об унифицированной версии. Но он вам не подходит (пока драйвер выдает ерунду при запросе SQL_DRIVER_VER типа информации). - person Victoria; 28.06.2017