关闭的Recordset返回(而不是错误)

问题描述:

我试图做一个ADO(不ADO.NET)应用弹性对连接故障:关闭的Recordset返回(而不是错误)

  • 关闭SQL Server服务在“服务”面板
  • 应用应该优雅反应并且允许重新连接

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

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

看来,这种行为是由两个LEFT OUTER JOIN s的同桌存在于uniqueidentifier列触发:没有这种连接的查询,或者只有一个这样的加盟,将引发错误(如预期)时,SQL服务器已关闭,而带有两个LEFT OUTER JOIN的查询只返回关闭的记录集。

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

规格:到目前为止的Windows 7 32位,SQL Server 2008 R2的

+0

这就是为什么人们在Windows机器上从Linux世界安装服务的原因。这不会发生在MySQL或其他此类产品上。我没有真正进入数据库,但从我的网络服务器体验来看,M $服务器是最糟糕的。当你切换到PHP之类的东西时,你会立即认识到你在IIS/ASP中梦寐以求的好功能。 – Zdenek

+0

@Zdenek:现在,这是一个很好的尝试,开始一场火焰战争...... – krlmlr

+0

尽管我可以看到它是如何被看作是如此,但还是没有。这是我通过第一手经验所获得的意见。你的可能会有所不同。 – Zdenek

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