为什么Delphi控制台应用程序需要表格才能使TSQLConnection工作?

时间:2014-03-25 03:50:02

标签: sql-server delphi console-application

我有一个使用Delphi XE2编写的简单控制台应用程序。

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错误:无法正确初始化驱动程序。客户端库   可能丢失,安装不正确,版本错误,或者   系统路径中可能缺少驱动程序。'

如果我向应用程序添加一个VCL表单,我会弹出一个关于启用“Visual Component Library”框架的弹出窗口,我说,并且没有做任何其他事情,现在当我运行应用程序,我得到'myConnection已连接'。

我能看到的唯一区别在于使用条款:

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

如果我从uses子句中删除'Unit1.pas'{Form1} 中的 Unit1,则该应用无法连接。

我不想在我的控制台应用程序中包含一个表单,所以当我这样做时,程序会发生什么?

1 个答案:

答案 0 :(得分:10)

VCL在初始化期间内部调用CoInitialize(在当前线程上初始化COM库),但控制台应用程序没有(在需要一些COM东西的工作线程中出现同样的问题)。
只需在程序开头或初始化部分进行 CoInitialize 调用,然后在工作后进行CoUninitialize。

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