连接丢失后执行命令时,已关闭的记录集返回(而不是错误)

时间:2014-05-25 17:08:50

标签: sql-server sql-server-2008-r2 ado recordset

我正在努力使ADO(而不是ADO.NET)应用程序能够抵御连接故障:

  • 在“服务”面板中关闭SQL Server服务
  • 应用程序应该正常反应并允许重新连接

第一个问题是检测连接丢失。使SQL服务器脱机时,打开的连接对象的State属性仍包含adStateOpen,如果查询因连接丢失而失败,则不会更改。 It appears检查SQLState = "08S01"可用于检测丢失的连接 - 如果执行查询会引发错误。

但是,我注意到Command.Execute发出的一些(并非所有)查询会返回已关闭的Recordset(!),而不是引发错误;当我预先创建Recordset对象然后调用Recordset.Open时,会发生同样的情况。 The docs在这里不是特别有用 - 它们表示如果查询没有返回值,记录集将被关闭,但我不希望通信链接失败作为有效原因因为这里没有返回值...

似乎这种行为是由两个LEFT OUTER JOINuniqueidentifier列上存在同一个表而触发的:没有此类连接的查询,或只有一个此类连接的查询会引发错误(正如预期的那样)当SQL服务器关闭时,而具有两个LEFT OUTER JOIN的查询只返回一个已关闭的记录集。

有人可以解释这种奇怪的行为吗?这有点困难,但我可以根据要求提供最小的VB6示例。 编辑:构建真正最小化示例的第一次尝试失败。

规格:最新的Windows 7 32位,SQL Server 2008 R2

1 个答案:

答案 0 :(得分:0)

这似乎与ADO的弱文档功能有关:如果在发出新查询时仍然打开CursorType设置为adUseServer(默认值!)的记录集,则第二个连接将是由ADO建立。