TADOConnection
在Delphi ISAPI App(TISAPIApplication
)的应用程序初始化部分中无法连接:
应用程序是用Delphi XE SPI构建的,运行Win 7 64 / IIS 7.5和WinServer 2008 RS2-无法在全局ISAPI应用程序上下文中与ADO连接。 (示例代码使用的是MS-SQLServer OLEDB,但是使用Sybase ASE提供程序也会失败。)
调用conn.Open
时,以下代码失败-TADOConnection.open
永不返回-ISAPI应用程序在正常运行中挂起,未引发任何异常:
library ISAPIBareBones;
uses
ActiveX,
ADODB,
(...)
var
conn: TADOConnection;
begin
CoInitFlags := COINIT_MULTITHREADED;
Application.Initialize;
coinitialize(nil);
conn := TADOConnection.Create(Application);
conn.ConnectionString := 'Provider=SQLOLEDB.1;xxx';
//Fails here:
try
conn.Open;
except on e:exception do
logException(e)
end;
Application.WebModuleClass := WebModuleClass;
Application.Run;
end.
特定请求处理程序(Delphi webAction)中的相同代码运行良好。
我们怀疑在ISAPI应用程序级别的IIS中执行特权存在问题。但是据我们所知,整个IIS应用程序堆栈(从webServer本身到特定的虚拟目录)以及ISAPI dll本身都在具有相同执行特权的相同凭据下运行。
同时,我的解决方法是从http响应调用(ISAPI线程)中初始化数据库基础结构,然后只需检查它是否在每个后续调用中都已初始化。这行得通,但是给我带来了一些我不想处理的约束。
在处理传入请求之前,如何在
TISAPIApplication
实例中建立ADO数据库连接。 最佳答案
我认为问题在于您运行的代码在dll的主过程中运行。初始化的这一部分非常严格,例如您可能无法加载任何dll,
允许调用CoInitialize(请参见http://msdn.microsoft.com/en-us/library/ms678543%28v=vs.85%29.aspx)。
您的ActiveX问题会造成一些麻烦,这很可能是您的原因
例外。