在XE2 Enterprise中不使用DSN

时间:2016-12-02 03:02:37

标签: delphi odbc delphi-xe2 dbexpress

使用包含本机dbExpress ODBC支持的企业版XE2,我已经成功创建了一个" Connection"其中Database Name是System DSN的名称,Password是MS Access数据库密码。

我可以在Modify Connection页面上单击Test Connection,Database Explorer报告测试连接成功。

从Data Explorer中拖放连接会创建一个TSQLConnection,其Driver属性设置为ODBC,Params集合为:

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驱动程序管理器出错。

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

但是当在柏林运行相同的代码时,我得到一个"不允许重复#34;来自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;

由于自2013年以来尚未维护Open ODBC dbxExpress驱动程序,并且XE2和Berlin Enterprise附带了自己的ODBC dbxExpress驱动程序(Data.DBXOdbc),因此我想更改属性和参数以获取代码在XE2中使用本机ODBC驱动程序,然后检查它是否在柏林工作。

https://sourceforge.net/p/open-dbexpress/discussion/119359/thread/703de7d9/处的线程表明它应该只是用常规ODBC替换Open ODBC值。

http://docwiki.embarcadero.com/RADStudio/Berlin/en/DbExpress_Supported_Database_Management_Systems处的表格没有列出" Odbc"的任何库,所以我认为它是空白的。

编辑3(和答案)

在对代码进行了一些讨论之后,我在XE2 Enterprise和Berlin Enterprise中都有以下工作,以便使用本机ODBC dbxExpress驱动程序打开带有TSQLConnection对象的MS Access数据库。

  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,这不再是一个问题。剩下要做的就是确定新旧驱动程序的行为是否不同。

2 个答案:

答案 0 :(得分:0)

关于如何使用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;';

答案 1 :(得分:0)

为什么不修改源?

如下所示

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;