使用包含本機dbExpress ODBC支持的XE2企業版,我成功創建了一個「連接」,其中數據庫名稱是系統DSN的名稱,密碼是MS Access數據庫密碼。在不使用DSN的XE2 Enterprise中的數據資源管理器下設置與MS Access數據庫的ODBC連接
我可以在修改連接頁面上單擊測試連接,數據庫瀏覽器報告測試連接成功。
拖放從Data Explorer的連接創建一個帶有驅動程序屬性設置爲ODBC和PARAMS託收一個TSQLConnection:
drivername=ODBC
database=myaccessdbDSN
password=accessdbpwd
雖然這是偉大的測試,我寧願不要求ODBC系統DSN將爲其創建。
從我記憶中,DSN可以被正確格式的ConnectionString替換,通常可以通過查看DSN的文本來解決。不幸的是,XE2中的數據瀏覽器僅適用於系統DSN,而不適用於文件DSN。
當使用ODBC連接到MS Access數據庫文件時,TSQLConnection的ConnectionString應該是什麼?
EDIT 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驅動程序管理器會出現「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;
請注意,通常情況下,在運行時設置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,西雅圖或柏林不起作用。
EDIT 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替換Open ODBC值的問題。
表http://docwiki.embarcadero.com/RADStudio/Berlin/en/DbExpress_Supported_Database_Management_Systems沒有列出「Odbc」的任何庫,所以我認爲它是空白的。
編輯3(並回答)
後,一些與代碼faffing一下,我有以下兩個XE2企業和柏林企業合作,以打開MS Access數據庫與一個TSQLConnection對象使用本機ODBC dbxExpress驅動程序。
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,這不再是一個問題。剩下的唯一事情就是確定新車和新車的行爲是否有所不同。
http://www.connectionstrings.com –
更具體地說https://www.connectionstrings.com/access/ –
已經嘗試過,肯,但似乎有一些不尋常的約TSQLConnection需要信息的方式。我會用我發現的內容編輯我的問題。 – SiBrit