2014-03-25 52 views
4

我有一個使用Delphi XE2編寫的簡單控制檯應用程序。爲什麼Delphi控制檯應用程序需要表單才能使TSQLConnection正常工作?

program Project1; 

{$APPTYPE CONSOLE} 

{$R *.res} 

uses 
    System.SysUtils, 
    Data.DBXMSSQL, 
    Data.DB, 
    Data.SqlExpr; 

var 
    myConnection: TSQLConnection; 

begin 
    try 
    { TODO -oUser -cConsole Main : Insert code here } 

    myConnection := TSQLConnection.Create(nil); 
    myConnection.DriverName := 'MSSQL'; 
    myConnection.GetDriverFunc := 'getSQLDriverMSSQL'; 
    myConnection.LibraryName := 'dbxmss.dll'; 
    myConnection.VendorLib := 'sqlncli10.dll'; 
    myConnection.LoginPrompt := False; 
    myConnection.Params.Clear; 
    myConnection.Params.Add('drivername=MSSQL'); 
    myConnection.Params.Add('schemaoverride=%.dbo'); 
    myConnection.Params.Add('hostname=myserver'); 
    myConnection.Params.Add('database=mydb'); 
    myConnection.Params.Add('blobsize=1'); 
    myConnection.Params.Add('localcode=0000'); 
    myConnection.Params.Add('isolationlevel=ReadCommited'); 
    myConnection.Params.Add('os authentication=True'); 
    myConnection.Params.Add('prepare sql=False'); 
    myConnection.Connected := true; 

    Writeln('myConnection Is connected'); 
    except 
    on E: Exception do 
     Writeln(E.ClassName, ': ', E.Message); 
    end; 

    Readln; 
end. 

當我運行它,我得到這個錯誤:

'DBX Error: Driver could not be properly initialized. Client library may be missing, not installed properly, of the wrong version, or the driver may be missing from the system path.'

如果我添加一個VCL形式到應用程序,我得到彈出關於啓用「可視化組件庫」的框架,我說沒有,並且沒有做任何事情,現在當我運行應用程序時,我得到'myConnection已連接'。

我能看到的唯一區別是使用子句中:

uses 
    System.SysUtils, 
    Data.DBXMSSQL, 
    Data.DB, 
    Data.SqlExpr, 
    Unit1 in 'Unit1.pas' {Form1} 

如果我刪除1單元的「Unit1.pas」 {} Form1的從的使用條款,則應用程序無法連接。

我不想在我的控制檯應用程序中包含表單,所以當我這樣做時它會發生什麼情況?

回答

10

VCL在初始化期間(在當前線程上初始化COM庫)內部調用CoInitialize,但是控制檯應用程序沒有(在需要一些COM-stuff的工作線程中發生同樣的問題)。
只需在程序的開頭或初始化部分調用CoInitialize,並在工作後調用CoUninitialize。

http://docwiki.embarcadero.com/RADStudio/XE5/en/DbExpress_Database_Specific_Information

+0

,如果我只是添加Vcl.Controls到使用條款,因爲這有它自己的初始化和UNINIT節也有效。我知道的一點點黑客,但是當我只想要簡單的東西...... – SiBrit

相關問題