在不使用 DSN 的 XE2 Enterprise 中的 Data Explorer 下设置与 MS Access DB 的 ODBC 连接

Setup an ODBC connection to a MS Access DB under Data Explorer in XE2 Enterprise that does not use a DSN

使用包含本机 dbExpress ODBC 支持的企业版 XE2,我成功创建了一个 "Connection",其中数据库名称是系统 DSN 的名称,密码是 MS Access 数据库密码.

我可以在修改连接页面点击测试连接,数据库资源管理器报告测试连接成功。

从数据资源管理器中拖放连接会创建一个 TSQL连接,其中 Driver 属性 设置为 ODBC,参数 collection 为:

drivername=ODBC
database=myaccessdbDSN
password=accessdbpwd

虽然这非常适合测试,但我宁愿不需要创建 ODBC 系统 DSN 也能正常工作。

根据我的记忆,DSN 可以用正确格式的 ConnectionString 替换,通常可以通过查看 DSN 的文本来弄清楚。遗憾的是,XE2 中的数据资源管理器仅适用于系统 DSN,不适用于文件 DSN。

使用 ODBC 连接到 MS Access 数据库文件时,TSQLConnection 的 ConnectionString 应该是什么?

编辑 1

给定一个带有数据绑定网格的表单、一个 TDataSource、一个带有适当 SQL 命令的 TSQLQuery 和一个私有 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 Driver 管理器收到 "Connection Could Not Open" 错误。

  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;

请注意,通常在 运行 时设置 Driver 名称 属性 时,您必须设置一些通常在 [=89] 中定义的其他属性=] 文件。如果 DriverName 设置为 'MSSQL',它们是:

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

但是当 DriverName 设置为 'ODBC' 时,这些都是空白的。这是 dbxDriver for ODBC 的错误吗?

我已经查看了 http://docwiki.embarcadero.com/RADStudio/Berlin/en/Setting_Up_TSQLConnection 的帮助 但它并没有告诉我任何我还没有尝试过的东西,而且当句子

时它确实让我充满信心

To display the Connection Editor, double-click the TSQLConnection component.

不适用于 XE2、XE5、西雅图或柏林。

编辑 2

我看这个的全部原因是因为 Open ODBC dbxExpress driver 在柏林不再有效。以下将在 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得到一个"Duplicates not allowed"错误,它与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 driver 自 2013 年以来一直没有维护,并且 XE2 和 Berlin Enterprise 带有自己的 ODBC dbxExpress driver (Data.DBXOdbc),我想要更改属性和参数以使在 XE2 中工作的代码与本机 ODBC driver 一起工作,然后检查它在柏林是否工作。

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 的 table 没有列出 "Odbc" 的任何库,所以我认为它是空白的。

编辑 3(和答案)

在对代码进行一些操作之后,我得到了以下在 XE2 Enterprise 和 Berlin Enterprise 中工作的方法,以便使用 TSQLConnection object 打开 MS Access 数据库本机 ODBC dbxExpress driver.

  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 服务器 driver 并且想要更改为本地 MS SQL 服务器一:

,则需要进行类似的更改
//  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 drivers 的原因是我们最初有 XE2 Professional,它不包括 ODBC 或 SQL driver 作为标准。现在我们使用的是 Enterprise,这不再是问题。唯一剩下要做的就是确定新旧 driver 的行为是否不同。

关于如何使用 ODBC 驱动程序在 XE2 Enterprise 中设置到 MS Access 数据库的无 DSN 连接的原始问题的答案是:

  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;';

为什么不修改源代码?

喜欢下面

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;