关闭的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的
答
这似乎与ADO的弱记录功能:如果使用CursorType
设置为adUseServer
(!默认值)的记录仍然在发出新查询时打开,第二个连接将由ADO建立。
这就是为什么人们在Windows机器上从Linux世界安装服务的原因。这不会发生在MySQL或其他此类产品上。我没有真正进入数据库,但从我的网络服务器体验来看,M $服务器是最糟糕的。当你切换到PHP之类的东西时,你会立即认识到你在IIS/ASP中梦寐以求的好功能。 – Zdenek
@Zdenek:现在,这是一个很好的尝试,开始一场火焰战争...... – krlmlr
尽管我可以看到它是如何被看作是如此,但还是没有。这是我通过第一手经验所获得的意见。你的可能会有所不同。 – Zdenek