2016-12-02 65 views
1

使用包含本機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,這不再是一個問題。剩下的唯一事情就是確定新車和新車的行爲是否有所不同。

+1

http://www.connectionstrings.com –

+1

更具體地說https://www.connectionstrings.com/access/ –

+0

已經嘗試過,肯,但似乎有一些不尋常的約TSQLConnection需要信息的方式。我會用我發現的內容編輯我的問題。 – SiBrit

回答

0

的答案,原來的問題上如何設置使用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;'; 
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; 
相關問題