我有一个Delphi程序(D2010),它使用ADO组件(TADOConnection和TADOQuery)访问本地SQL Server 2005 Express数据库。在程序启动时,我使用相关的子查询来识别一系列值的特定字段的最大值。这在我们所有的测试中都很有效。
但是,在某些客户系统上,我们已经看到如果我们的程序立即关闭并重新启动,则在运行带有EOleException的子查询时程序将失败“无法支持所请求的属性”。程序的后续重新启动会重复此错误,直到PC重新启动。在这种状态下,程序中的所有其他数据库访问似乎都可以;这是程序中唯一使用相关子查询。
相关的子查询是:
SELECT p1.*
FROM Packs p1
WHERE p1.MachID = :MachID
AND p1.BuildID <= :MaxPosID
AND p1.PackID =
(
SELECT MAX(p2.PackID)
FROM packs p2
WHERE p2.BuildID = p1.BuildID
and p2.MachID = p1.MachID
)
ORDER BY BuildID
MachID和MaxPosID字段在单个系统上不会更改,因此在任何程序运行中查询都是相同的。与客户系统的唯一区别是它们可能运行较大的数据库(典型值为1GB)。
我添加了一些代码来迭代数据库连接属性,并且在我们的工作系统上看到'Subquery Support'属性的值为31H,根据
http://msdn.microsoft.com/en-us/library/office/aa140022(v=office.10).aspx表示支持相关子查询。
我假设当客户网站上出现问题时,由于某种原因,该属性没有设置相同的值。
一种解决方法是打开命令提示符,并使用sqlcmd只是'USE(我们的数据库名称)'。如果此命令提示符保持打开状态,则我们的程序将正常启动。我不知道这将如何影响我们的程序的运行,或连接对象返回的属性的值。
关于支持的属性发生变化的原因,或者为什么程序关闭/启动应该看到这种变化?
我可以重写代码,将相关子查询的使用替换为表中较慢的搜索,直到找到所有必需的值,这可能不会受到问题的影响,但我想了解什么是发生。
编辑:连接字符串为:
Provider=SQLNCLI.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=TQSquality
在运行时修改连接字符串以添加“OLE DB Services = -2”,以关闭连接池。
查询由以下人员执行:
SetCnx(LastPackIDQry, CnxQuality);
LastPackIDQry.Parameters[0].Value := GetMachNo;
LastPackIDQry.Parameters[1].Value := TQS.PosRange.Last;
QryOpen(LastPackIDQry);
try
while not Eof do
begin
...处理数据
QryOpen是一个只调用.Open的输入查询实用程序,但提供了一些错误记录。正如我所提到的,这两个参数对于特定的机器是固定的,所以我无法相信问题与查询有关;必须与连接或数据库有关。
TIA Ian