我正在努力使ADO(而不是ADO.NET)应用程序能够抵御连接故障:
第一个问题是检测连接丢失。使SQL服务器脱机时,打开的连接对象的State
属性仍包含adStateOpen
,如果查询因连接丢失而失败,则不会更改。 It appears检查SQLState = "08S01"
可用于检测丢失的连接 - 如果执行查询会引发错误。
但是,我注意到Command.Execute
发出的一些(并非所有)查询会返回已关闭的Recordset
(!),而不是引发错误;当我预先创建Recordset
对象然后调用Recordset.Open
时,会发生同样的情况。 The docs在这里不是特别有用 - 它们表示如果查询没有返回值,记录集将被关闭,但我不希望通信链接失败作为有效原因因为这里没有返回值...
似乎这种行为是由两个LEFT OUTER JOIN
在uniqueidentifier
列上存在同一个表而触发的:没有此类连接的查询,或只有一个此类连接的查询会引发错误(正如预期的那样)当SQL服务器关闭时,而具有两个LEFT OUTER JOIN
的查询只返回一个已关闭的记录集。
有人可以解释这种奇怪的行为吗?这有点困难,但我可以根据要求提供最小的VB6示例。 编辑:构建真正最小化示例的第一次尝试失败。
规格:最新的Windows 7 32位,SQL Server 2008 R2
答案 0 :(得分:0)
这似乎与ADO的弱文档功能有关:如果在发出新查询时仍然打开CursorType
设置为adUseServer
(默认值!)的记录集,则第二个连接将是由ADO建立。