简短的问题:
我发现我需要使用MARS而不是ADO / OLEDB,这是正确的吗?
我发现我需要使用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”.
我感到困惑/惊讶.这是正确/预期的,还是我错过了什么?
解决方法
如果有人有兴趣,我发现问题/区别是什么.由于ADO案例中的一个微妙问题,我不得不重新访问代码,结果证明这是相关的.
如果你需要多个并发RecordSet,那么使用ODBC很容易,因为如果你不使用MARS,它只是错误,如上所述.
然而,使用ADO / OLEDB,它更加微妙.当我不使用MARS时,多个RecordSets似乎正常工作.但是,在幕后,会发生什么是ADO自动为每个会话打开另一个新会话,但你不知道它并且无法分辨.事实证明这是非常缓慢的,因为每个会话都需要一个完整的审计登录和关闭,我一直在创造,关闭和重新创造.
因此,我为ADO提供了“MARS Connection = True”,并且lo&看来,它现在的行为与ODBC类似,重新使用现有连接而不是创建新连接.
所以道德是:你必须拥有MARS for ODBC,而ADO / OLEDB将允许多个并发RecordSets而不使用MARS做自己的事情,但它可能(好)不是你想要/最好的.