Установите соединение ODBC с базой данных MS Access в проводнике данных в XE2 Enterprise, которое не использует DSN

Используя корпоративную версию XE2, которая включает встроенную поддержку dbExpress ODBC, я успешно создал «Соединение», где имя базы данных является именем системного DSN, а пароль - паролем базы данных MS Access.

Я могу щелкнуть «Проверить соединение» на странице «Изменить соединение», и в обозревателе баз данных появится сообщение «Тестовое соединение выполнено успешно».

Перетаскивание соединения из проводника данных создает соединение TSQLConnection со свойством Driver, установленным на ODBC, а коллекция Params:

drivername=ODBC
database=myaccessdbDSN
password=accessdbpwd

Хотя это отлично подходит для тестирования, я бы предпочел не требовать создания системного DSN ODBC для его работы.

Насколько я помню, DSN можно просто заменить ConnectionString правильного формата, и обычно его можно определить, просмотрев текст DSN. К сожалению, проводник данных в XE2 работает только с системными DSN, а не с файловыми DSN.

Какой должна быть ConnectionString TSQLConnection при использовании ODBC для подключения к файлу базы данных MS Access?

ИЗМЕНИТЬ 1

Учитывая форму с сеткой привязки к данным, TDataSource, TSQLQuery с соответствующей командой SQL и частное соединение TSQLConnection (не компонент формы), работает следующее:

  FSQLConnection := TSQLConnection.Create(nil);

  FSQLConnection.DriverName := 'ODBC';
  FSQLConnection.LoginPrompt := false;
  FSQLConnection.Params.Values['Database'] := 'myaccessdbDSN';
  FSQLConnection.Params.Values['Password'] := 'accessdbpwd';

  FSQLConnection.Connected := true;

  SQLQuery1.SQLConnection := FSQLConnection;

  SQLQuery1.Active := true;

Я вижу результаты запроса в сетке.

Что мне нужно сделать, так это заменить myaccessdbDSN на строку подключения. Если я сделаю следующее, что, по-видимому, должно работать, я получаю сообщение об ошибке «Не удалось открыть соединение» в диспетчере драйверов ODBC.

  FSQLConnection := TSQLConnection.Create(nil);

  FSQLConnection.DriverName := 'ODBC';
  FSQLConnection.LoginPrompt := false;
  FSQLConnection.Params.Values['ConnectionString'] := 'Provider=Microsoft.ACE.OLEDB.12.0;'+
                                                      'Data Source=myaccessdb.mdb;'+
                                                      'Jet OLEDB:Database Password=accessdbpwd;';

  FSQLConnection.Connected := true;

  SQLQuery1.SQLConnection := FSQLConnection;

  SQLQuery1.Active := true;

Обратите внимание, что обычно при установке свойства DriverName во время выполнения необходимо установить некоторые другие свойства, которые обычно определяются в файле dbxdrivers.ini. Если для DriverName задано значение «MSSQL», это:

GetDriverFunc=getSQLDriverMSSQL
LibraryName=dbxmss.dll
VendorLib=sqlncli10.dll

Но если для DriverName задано значение «ODBC», они будут пустыми. Это ошибка dbxDriver для ODBC или нет?

Я просмотрел справку по адресу http://docwiki.embarcadero.com/RADStudio/Berlin/en/Setting_Up_TSQLConnection, но он не сообщает мне ничего, что я еще не пробовал, и наполняет меня уверенностью, когда предложение

Чтобы открыть редактор подключений, дважды щелкните компонент TSQLConnection.

не работает в XE2, XE5, Сиэтле или Берлине.

ИЗМЕНИТЬ 2

Я смотрю на это потому, что драйвер Open ODBC dbxExpress больше не работает в Берлине. В XE2 будет работать следующее:

  FSQLConnection.DriverName := 'DbxOpenOdbc';
  FSQLConnection.GetDriverFunc := 'getSQLDriverODBCW';
  FSQLConnection.LibraryName := 'dbxoodbc.dll';
  FSQLConnection.VendorLib := 'odbcjt32.dll';
  FSQLConnection.Params.Values['DriverPackageLoader'] := 'TDBXDynalinkDriverLoaderOpenOdbc';
  FSQLConnection.Params.Values['IsolationLevel'] := 'ReadCommitted';
  FSQLConnection.Params.Values['RowSetSize'] := '20';
  FSQLConnection.Params.Values['Database'] := '?';
  FSQLConnection.Params.Values['ConnectionString'] := 'DRIVER={Microsoft Access Driver (*.mdb)};'+
                                                      'DBQ=myaccessdb.mdb;'+
                                                      'UID=;'+
                                                      'PWD=accessdbpwd;'+
                                                      'DriverId=25;'+
                                                      'FIL=MS Access;';

Но когда тот же код запускается в Берлине, я получаю ошибку «Дубликаты запрещены» от AddCommandFactory, которая связана с этим кодом в модуле Dbx34Drv, как показано ниже:

constructor TDbxOpenOdbcDriver.Create(DriverDef: TDBXDriverDef);
begin
{$IF CompilerVersion > 18.50}
  inherited Create(DriverDef, TDBXDynalinkDriverLoader);
  InitDriverProperties(TDBXOpenOdbcProperties.Create(DriverDef.FDBXContext));
  // '' makes this the default command factory.
  AddCommandFactory('', CreateCommandOpenOdbc);
  //AddCommandFactory(TDBXCommandTypes.DbxMetaData
{$ELSE}
  raise EDbxOODBCDriverError.Create('Not Implemented: TDbxOpenOdbcDriver.Create(DriverDef: TDBXDriverDef)');
{$IFEND}
end;

Поскольку драйвер Open ODBC dbxExpress не поддерживается с 2013 года, а XE2 и Berlin Enterprise поставляются со своим собственным драйвером ODBC dbxExpress (Data.DBXOdbc), я хочу изменить свойства и параметры, чтобы получить код, работающий в XE2. для работы с собственным драйвером ODBC, а затем проверьте, работает ли он в Берлине.

Тема на https://sourceforge.net/p/open-dbexpress/discussion/119359/thread/703de7d9/ указывает, что нужно просто заменить значения Open ODBC на обычные ODBC.

Таблица по адресу http://docwiki.embarcadero.com/RADStudio/Berlin/en/DbExpress_Supported_Database_Management_Systems не содержит никаких библиотек для Odbc, поэтому я предполагаю, что это будет пустым.

ИЗМЕНИТЬ 3 (И ОТВЕТИТЬ)

Поработав с кодом, я получил следующие возможности для работы как в XE2 Enterprise, так и в Berlin Enterprise, чтобы открыть базу данных MS Access с объектом TSQLConnection, используя собственный драйвер ODBC dbxExpress.

  FSQLConnectionAccess.DriverName := 'ODBC';
  FSQLConnectionAccess.GetDriverFunc := 'getSQLDriverODBCW';
  FSQLConnectionAccess.LibraryName := '';
  FSQLConnectionAccess.VendorLib := 'odbcjt32.dll';
  FSQLConnectionAccess.Params.Values['DriverPackageLoader'] := 'TDBXOdbcDriverLoader';
  FSQLConnectionAccess.Params.Values['IsolationLevel'] := 'ReadCommitted';
  FSQLConnectionAccess.Params.Values['RowSetSize'] := '20';
  FSQLConnectionAccess.Params.Values['Database'] := '?';
  FSQLConnectionAccess.Params.Values['ConnectionString'] := 'DRIVER={Microsoft Access Driver (*.mdb)};'+
                                                      'DBQ=myaccessdb.mdb;'+
                                                      'UID=;'+
                                                      'PWD=accessdbpwd;'+
                                                      'DriverId=25;'+
                                                      'FIL=MS Access;';

Обратите внимание на то, что используемая строка подключения не похожа на строки, показанные на http://www.connectionstrings.com, которые это основная причина, по которой я не использую этот сайт для разработки Delphi.

Аналогичное изменение требуется, если вы использовали драйвер DevArt SQL Server и хотите перейти на собственный драйвер MS SQL Server:

//  FSQLConnectionSQL.DriverName := 'DevArtSQLServer';
//  FSQLConnectionSQL.GetDriverFunc := 'getSQLDriverSQLServer';
//  FSQLConnectionSQL.LibraryName := 'dbexpsda40.dll';
//  FSQLConnectionSQL.VendorLib := 'sqloledb.dll';

становится

  FSQLConnectionSQL.DriverName := 'MSSQL';
  FSQLConnectionSQL.GetDriverFunc := 'getSQLDriverMSSQL';
  FSQLConnectionSQL.LibraryName := 'dbxmss.dll';
  FSQLConnectionSQL.VendorLib := 'sqlncli10.dll';

Причина, по которой мы использовали драйверы Open ODBC и DevArt SQL Server, заключается в том, что изначально у нас был XE2 Professional, который не включал драйверы ODBC или SQL в качестве стандарта. Теперь, когда мы используем Enterprise, это больше не проблема. Осталось только определить, по-разному ли ведут себя старые и новые драйверы.


person SiBrit    schedule 02.12.2016    source источник
comment
connectionstrings.com   -  person Ken White    schedule 02.12.2016
comment
В частности, connectionstrings.com/access.   -  person Ken White    schedule 02.12.2016
comment
Кен уже пробовал, но, похоже, есть что-то необычное в том, как TSQLConnection требует информации. Я отредактирую свой вопрос тем, что я нашел.   -  person SiBrit    schedule 05.12.2016


Ответы (2)


Ответ на исходный вопрос о том, как настроить подключение без DSN к базе данных MS Access в XE2 Enterprise с помощью драйвера ODBC:

  FSQLConnectionAccess.DriverName := 'ODBC';
  FSQLConnectionAccess.GetDriverFunc := 'getSQLDriverODBCW';
  FSQLConnectionAccess.LibraryName := '';
  FSQLConnectionAccess.VendorLib := 'odbcjt32.dll';
  FSQLConnectionAccess.Params.Values['DriverPackageLoader'] := 'TDBXOdbcDriverLoader';
  FSQLConnectionAccess.Params.Values['IsolationLevel'] := 'ReadCommitted';
  FSQLConnectionAccess.Params.Values['RowSetSize'] := '20';
  FSQLConnectionAccess.Params.Values['Database'] := '?';
  FSQLConnectionAccess.Params.Values['ConnectionString'] := 'DRIVER={Microsoft Access Driver (*.mdb)};'+
                                                      'DBQ=myaccessdb.mdb;'+
                                                      'UID=;'+
                                                      'PWD=accessdbpwd;'+
                                                      'DriverId=25;'+
                                                      'FIL=MS Access;';
person SiBrit    schedule 04.12.2016

Почему бы не изменить исходный код?

Как показано ниже

constructor TDbxOpenOdbcDriver.Create(DriverDef: TDBXDriverDef);
begin
{$IF CompilerVersion > 18.50}
  inherited Create(DriverDef, TDBXDynalinkDriverLoader);
  InitDriverProperties(TDBXOpenOdbcProperties.Create(DriverDef.FDBXContext));
  // '' makes this the default command factory.
  //AddCommandFactory('', CreateCommandOpenOdbc);
  AddCommandFactory('Dbxoodbc', CreateCommandOpenOdbc);
  //AddCommandFactory(TDBXCommandTypes.DbxMetaData
{$ELSE}
  raise EDbxOODBCDriverError.Create('Not Implemented: DbxOpenOdbcDriver.Create(DriverDef: TDBXDriverDef)');
{$IFEND}
end;
person Eden WU    schedule 18.01.2017