2016-12-02 5 views
1

네이티브 dbExpress ODBC 지원을 포함하는 Enterprise 버전의 XE2를 사용하여 데이터베이스 이름 시스템 DSN의 이름이고 암호는 MS Access 데이터베이스 암호입니다.DSN을 사용하지 않는 XE2 Enterprise의 데이터 탐색기에서 MS Access DB에 대한 ODBC 연결 설정

연결 수정 페이지에서 연결 테스트를 클릭하면 데이터베이스 탐색기에 테스트 연결이 성공했다는 보고서가 표시됩니다. 드래그하고 데이터 탐색기에서 연결을 삭제

는 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 드라이버 관리자에서 "연결을 열 수 없습니다"오류가 발생합니다. 런타임시를 DriverName 속성을 설정할 때

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; 

, 일반적으로 해당 내용을 일반적으로 dbxdrivers.ini 파일에 정의 된 다른 속성의 일부를 설정해야합니다.

GetDriverFunc=getSQLDriverMSSQL 
LibraryName=dbxmss.dll 
VendorLib=sqlncli10.dll 

을하지만를 DriverName가 'ODBC'로 설정되어있는 경우,이 비어 있습니다 :적인 driverName이 'MSSQL'로 설정되어있는 경우, 이러한이다. ODBC 용 dbxDriver에 대한 결함입니까? ,

나는 http://docwiki.embarcadero.com/RADStudio/Berlin/en/Setting_Up_TSQLConnection 에 도움을 봤는데하지만 나는 이미 시도하지 않은 아무것도 말하지 않고, 문장

가 연결 편집기를 표시 할 때 자신있게 저를 채울 않습니다 TSQLConnection 구성 요소를 두 번 클릭하십시오.

은 XE2, XE5, Seattle 또는 Berlin에서 작동하지 않습니다.

편집 2

열기 ODBC dbxExpress 드라이버가 더 이상 베를린에서 작동하기 때문에 나는이보고하고 전체 이유는 없다.

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

을하지만 같은 코드가 베를린에서 실행될 때, 나는 같이 Dbx34Drv 단위로이 코드에 관련되어있는 AddCommandFactory에서,는 "중복은 허용되지 않습니다"오류 : 다음은 XE2에서 작동합니다 아래 : 열기 ODBC dbxExpress 드라이버로

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 년부터 유지되지 않았으며, XE2 베를린 기업이 자신의 ODBC dbxExpress 드라이버 (Data.DBXOdbc)와 함께 있음을, 내가 속성과 매개 변수를 변경할 걸려 네이티브 ODBC 드라이버에서 작동하도록 XE2에서 작동하는 코드를 가져온 다음 베를린에서 작동하는지 확인하십시오.

https://sourceforge.net/p/open-dbexpress/discussion/119359/thread/703de7d9/의 스레드는 Open ODBC 값을 일반 ODBC 컴퓨터로 대체해야 함을 나타냅니다.

테이블에 http://docwiki.embarcadero.com/RADStudio/Berlin/en/DbExpress_Supported_Database_Management_Systems은 "Odbc"에 대한 라이브러리를 나열하지 않으므로 비어 있다고 가정합니다.

EDIT 3 (AND ANSWER) 코드에 대해 faffing 일부 후

, 나는 TSQLConnection에서 객체와 MS Access 데이터베이스를 열기 위해 XE2 엔터프라이즈 및 베를린 기업 모두에서 작동하려면 다음을 가지고있다 네이티브 ODBC dbxExpress 드라이버 사용. 사용 된 연결 문자열 내가 델파이 개발을 위해 해당 사이트를 사용하지 않는 주된 이유 http://www.connectionstrings.com에 표시된 것과 같은 아무것도 방법

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

참고.

유사한 변화는 당신이 DevArt SQL Server 드라이버를 사용한다면 필요하며 기본 MS SQL 서버 하나에 변경하려는된다

// 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 드라이버를 사용하는 것은 원래 ODBC 또는 SQL 드라이버를 표준으로 포함하지 않은 XE2 Professional을 사용했다는 것입니다. 이제는 엔터프라이즈를 사용하고 있으므로 더 이상 문제가되지 않습니다. 남은 유일한 것은 오래된 드라이버와 새로운 드라이버가 다르게 동작하는지 확인하는 것입니다.

+1

http://www.connectionstrings.com –

+1

구체적 –

+0

이미 켄,하지만 대한 특별한 뭔가를 할 수있을 것 같습니다 것을 시도 https://www.connectionstrings.com/access/ TSQLConnection이 정보를 필요로하는 방식. 나는 내 질문을 내가 찾은 것으로 편집 할 것이다. – SiBrit

답변

0

설정에 ODBC 드라이버를 사용 XE2 엔터프라이즈에서 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;'; 
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;