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