"对象已打开"使用Delphi,SQL Server和ADO时出错

时间:2014-08-07 08:50:53

标签: sql-server delphi ado delphi-5

打开返回大型数据集(大约700,000行和75列)的TADOQuery时,我收到“对象已打开”错误。

我的8个字段是派生字段为varchar(200),我发现如果我将它们更改为varchar(95)或更少,或varchar(256)或更多,即仅错误,则不会发生错误发生在96-255范围内。如果我从查询中删除这些列,或者如果选择较少的行,则也不会发生错误。

谷歌搜索已经建议这是SQLOLEDB的已知错误,其中nvarchar字段大于127,但对我来说情况并非如此。我正在使用SQLOLEDB,但我尝试改为更改为SQL Server Native Client,但错误仍然存​​在。

任何人都可以对此有所了解,我很难过。我正在使用Delphi 5和SQL Server 2008R2,查询选择数据到临时表,然后从临时表中选择,如下所示(这是实际查询的简化版本,使用75列和8个表):

select memno, surname, forename, 
'EE Conts in Year'= CAST('' as varchar(200)),
'ER Conts in Year'= CAST('' as varchar(200)),
'AVC Conts in Year'= CAST('' AS VARCHAR(200)),
'ERAVC Conts in Year'= CAST('' AS VARCHAR(200)),
'Total EE Conts'= CAST('' AS VARCHAR(200)),
'Total ER Conts'= CAST('' AS VARCHAR(200)),
'Total AVC Conts'= CAST('' AS VARCHAR(200)),
'Total ERAVC Conts'= CAST('' AS VARCHAR(200)),
into #tmptab
from members

select * from #tmptab
order by surname

由于

2 个答案:

答案 0 :(得分:2)

我收到了同样的错误,对我来说,我的TAdoQuery属性的一些更改修复了它。我的情况与你的情况有所不同,所以在进行适合我的更改之前,我会对其进行描述。

我有一张相当大的桌子; 684,673行,107列,数据大小为636240 KB。它有三组重复列,我将标准化为三个新表。查询?

SELECT * FROM MyTable

所以这只是一个直接的表格,只有一个方向。处理不需要任何特定的顺序,因此在主键之外添加索引不会有帮助。由于我没有对此表进行任何更改,因此它是一个只读命题。什么都不需要显示。

当我尝试将此表的TADOQuery.Active属性设置为true时,我在Delphi IDE中收到错误。换句话说,只是尝试在IDE中打开它会引发错误。在我可以在IDE中成功打开它之前,检查我的任何代码都没有意义。

我对此表的TADOQuery进行了以下更改:

CommandTimeout: 600

CursorLocation: clUseServer

CursorType: ctOpenForwardOnly

EnableBCD:错误

LockType: ltReadOnly

错误不再发生在IDE或我的处理代码中。

可能只需要其中一项更改。如果是这样,我不知道是哪一个,因为我没有一次一个地测试它们。我只是做了所有看起来像候选人的变化,以便为查询提供最佳的成功机会。

答案 1 :(得分:-1)

只需更改YourADOQuery(如果已应用)的查询,然后将其Active属性设置为true,如下所示:

YourADOQuery.SQL.Text := 'select top 100 * from ' + YourADOQuery.SQL.Text + ')a';

请注意,100不是'100 PERCENT'!但会返回记录的100%:)