我有一个使用TADOConnection
连接到MSSQL的服务应用程序,并使用Cromis.IPC
的{{1}}对象为客户端应用程序提供一些数据。此服务应用程序可能安装在运行MSSQL的同一台计算机上,可能会在TIPCServer
服务之前启动。所以,我无法在MSSQL
事件中连接到ADO。我试图在OnServiceStart
OnExecuteRequest
事件中连接到ADO,但由于它是在一个单独的线程中运行,我得到了“CoInitialize尚未被调用”。然后,我尝试将此与我的主线程同步:
TIPCServer
但它不起作用。我的申请就在那里停止响应。
接下来,我修改了TThread.Synchronize(nil, ConnectDB);
事件以传递调用它作为参数的线程,我尝试了这个:
OnExecuteRequest
但没有变化。当我打开使用调试DCU时,我发现我的应用程序在此行停止响应:
AThread.Synchronize(AThread, ConnectDB);
我完全迷失了。有什么想法吗?
PS:我没有提供我的代码来防止问题混乱。如果您需要它的任何部分,请告诉我。
PS 2:在此之前,我尝试在服务应用程序中使用Timer等待一段时间再连接到MSSQL。即使在加载网络驱动程序之前,MSSQL似乎很快就会启动(我安装了McAfee VSE 8.7,它取代了网络驱动程序)。我的服务连接到MSSQL,但是,当加载网络驱动程序时,连接中断。如果有一种方法告诉Windows(XP和更高版本)在加载网络驱动程序后启动服务,我的问题就解决了。任何提示都非常感激。
答案 0 :(得分:1)
在CoInitialize(nil);
构造函数中调用TThread
,并在其析构函数中调用CoUnitialize
。它们都在ComObj
单位宣布;您可能需要将其添加到包含线程类的单元中的uses
子句中。
数据库连接是特定于线程的(意味着每个线程必须拥有自己的连接),而ADO
需要COM;这意味着线程必须为自己初始化COM,并且应该在线程结束时释放它。