在不使用 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;
使用包含本机 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;