7

简短的问题:我发现我需要通过 ODBC 使用 MARS,而不是通过 ADO/OLEDB,对吗?

更长的解释:

我刚刚发现我的 ODBC 代码(使用“Driver={SQL Native Client}”,MFC CDatabase 代码)需要 MARS(“MARS_Connection=yes;”),因为虽然我在打开 RecordSet 时没有发出多个 SELECT,但我确实这样做了获取一批行,然后需要打开另一个RecordSet发出新的SELECT,然后返回第一个RecordSet进行下一批。如果没有 MARS,我会收到 ODBC 错误“连接正忙于处理另一个命令的结果”。一切都很公平。

但是,我的代码与 ADO/OLEDB ("Provider=SQLNCLI", #import msado15.dll) 而不是 ODBC 的工作方式相同。在同样的情况下,我不必指定“MarsConn=yes”。

我很困惑/惊讶。这是正确的/预期的,还是我错过了什么?

4

1 回答 1

6

如果有人感兴趣,我会发现问题/差异是什么。由于 ADO 案例中的一个微妙问题,我不得不重新访问代码,结果证明这是相关的。

如果您需要多个并发 RecordSet,使用 ODBC 很容易,因为如果您不使用 MARS,它只会出错,如上所述。

然而,对于 ADO/OLEDB,它更加微妙。当我不使用 MARS 时,多个 RecordSet 似乎可以正常工作。但是,在幕后,ADO 会自动为每个会话打开另一个新会话,但您不知道也无法分辨。事实证明这真的很慢,因为每个会话都需要完整的审核登录和关闭,而我一直在创建、关闭和重新创建。

所以我为 ADO 输入了“MARS Connection=True”,你瞧,它现在的行为就像 ODBC,重新使用现有的连接而不是创建新的连接。

所以道德是:你必须有 MARS 用于 ODBC,而 ADO/OLEDB 将通过做自己的事情来允许多个没有 MARS 的并发 RecordSet,但它可能(很好)不是你想要的/最好的。

于 2010-05-19T16:03:57.270 回答