来自MARS的ODBC是来自VENUS的ADO / OLEDB吗?

时间:2010-02-18 09:51:08

标签: odbc oledb ado recordset mars

简短问题: 我发现我需要使用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”。

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

1 个答案:

答案 0 :(得分:6)

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

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

然而,使用ADO / OLEDB,它更加微妙。当我不使用MARS时,多个RecordSet似乎工作正常。但是,在幕后,会发生什么是ADO自动为每个会话打开另一个新会话,但你不知道它并且无法分辨。事实证明这是非常缓慢的,因为每个会话都需要一个完整的审计登录和关闭,我一直在创造,关闭和重新创造。

所以我为ADO输入了“MARS Connection = True”,并且,lo&看来,它现在的行为与ODBC类似,重新使用现有连接而不是创建新连接。

所以道德是:你必须拥有MARS for ODBC,而ADO / OLEDB将允许多个并发RecordSets而没有MARS做自己的事情,但它可能(好)不是你的想/是最好的。