【问题标题】:"Object Was Open" error using Delphi, SQL Server and ADO使用 Delphi、SQL Server 和 ADO 时出现“对象已打开”错误
【发布时间】:2014-08-07 08:50:53
【问题描述】:

打开返回大型数据集(大约 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

谢谢

【问题讨论】:

  • 该错误对应于DB_E_OBJECTOPEN 错误,这(除了错误)意味着您的提供商需要打开另一个连接以支持该操作。您是否尝试过link 中的说明?
  • 感谢您的信息,我已经尝试了该帖子中的建议,但无济于事。我尝试将“多个连接”显式设置为 True(尽管老实说它已经是 True),我尝试仅为此查询使用单独的连接,并尝试为此查询使用单独的 TADOQuery,但仍然出现错误。跨度>
  • 我似乎记得Delphi-5 ADO 库存在一些问题,并且发布了一个补丁。你安装了吗?不知道它是否会有所帮助,但值得一试。
  • 您可以edit 添加实际的表定义(DDL 语句)来创建导致问题的表吗?到目前为止,您发布的内容是要求我们根据很少的信息推测可能是什么问题,而这种类型的问题在这里并不合适。
  • Guillem,是的,你没记错,我使用的是 ADO 的补丁版本。

标签: sql-server delphi ado delphi-5


【解决方案1】:

我收到了同样的错误,对我来说,我的 TAdoQuery 属性的一些更改修复了它。我的情况与您的情况有些不同,所以我会先描述一下,然后再进行对我有用的更改。

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

SELECT * FROM MyTable

所以这只是一条穿过桌子的直线,只有一个方向。该处理不需要任何特定的顺序,因此在主键之外添加索引将无济于事。由于我没有对此表进行任何更改,因此这是一个只读命题。无需显示任何内容。

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

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

CommandTimeout:600

光标位置:clUseServer

光标类型:ctOpenForwardOnly

启用 BCD:错误

LockType:ltReadOnly

错误不再发生,无论是在 IDE 中还是在我的处理代码中。

可能只有其中一项更改是必要的。如果是这样,我不知道是哪个,因为我没有一次一个地测试它们。我只是做了所有看起来像候选的更改,以使查询获得最大的成功机会。

【讨论】:

  • 谢谢@Wes,只更改 CursorLocation 为我做了。
【解决方案2】:

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

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

请注意,100 不是“100 %”!但返回 100% 的记录 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-01
    • 2010-11-30
    • 1970-01-01
    • 2023-01-16
    • 2011-02-28
    相关资源
    最近更新 更多