打开返回大型数据集(大约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
由于
答案 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%:)