【问题标题】:Why Does Delphi Console Application Need Form For TSQLConnection To Work?为什么 Delphi 控制台应用程序需要表单才能使 TSQLConnection 工作?
【发布时间】:2014-05-02 17:39:52
【问题描述】:

我有一个使用 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”框架的弹出窗口,我说 No 拒绝,并且没有做任何其他事情,现在当我运行应用程序,我得到“myConnection 已连接”。

我能看到的唯一区别是uses子句:

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

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

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

【问题讨论】:

    标签: sql-server delphi console-application


    【解决方案1】:

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

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

    【讨论】:

    • 如果我只是将 Vcl.Controls 添加到 uses 子句中也可以使用,因为它有自己的 Init 和 Uninit 部分。我知道有点 hack,但是当我只想要一些简单的东西时......
    猜你喜欢
    • 1970-01-01
    • 2017-12-31
    • 1970-01-01
    • 2013-01-21
    • 2019-12-23
    • 2019-05-18
    • 1970-01-01
    • 2019-05-30
    • 2015-05-04
    相关资源
    最近更新 更多