设置在XE2企业在数据资源管理器的ODBC连接到MS Access数据库不使用DSN(Setup a

2019-09-29 18:44发布

使用企业版XE2的,其中包括原生的dbExpress ODBC的支持,我已经成功创建了“连接”里的数据库名称是系统DSN的名称和密码是MS Access数据库的密码。

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

拖放从Data Explorer的连接创建一个带有驱动程序属性设置为ODBC和PARAMS托收一个TSQLConnection:

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的ODBC或没有错吗?

我已经通过帮忙看着http://docwiki.embarcadero.com/RADStudio/Berlin/en/Setting_Up_TSQLConnection ,但它并没有告诉我了,我还没有尝试过,而且它的时候了一句让我充满自信

要显示连接编辑器,双击TSQLConnection组件。

在XE2,XE5,西雅图或柏林不起作用。

编辑2

我在看这个的全部原因是因为开放式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;

作为开放ODBC驱动程序dbxExpress尚未自2013年起保持,而XE2和柏林的企业都拥有自己的ODBC驱动程序dbxExpress(Data.DBXOdbc),我想改变的属性和参数,以获得其在XE2工作的代码与本地ODBC驱动程序的工作,并确认其工作在柏林。

在螺纹https://sourceforge.net/p/open-dbexpress/discussion/119359/thread/703de7d9/表明它应该只是定期ODBC那些更换打开ODBC值的问题。

在该表http://docwiki.embarcadero.com/RADStudio/Berlin/en/DbExpress_Supported_Database_Management_Systems没有列出“ODBC”任何图书馆,所以我想这将是空白。

编辑3(并回答)

经过一番faffing有关的代码,我有以下两个XE2企业和柏林企业合作,以打开MS Access数据库使用本机ODBC驱动程序dbxExpress一个TSQLConnection对象。

  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专业,其中不包括ODBC或SQL驱动作为标准配置。 现在,我们正在使用的企业,这已不再是一个问题。 剩下要做的唯一事情是确定新老司机的行为不同。

Answer 1:

这个问题的答案如何设置使用ODBC驱动程序在XE2企业一个DSN-less连接到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;';


Answer 2:

为什么不修改源?

如下图所示

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;


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