来自MARS的ODBC是来自VENUS的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做自己的事情,但它可能(好)不是你想要/最好的.

相关文章

应用场景 C端用户提交工单、工单创建完成之后、会发布一条工...
线程类,设置有一个公共资源 package cn.org.chris.concurre...
Java中的数字(带有0前缀和字符串)
在Java 9中使用JLink的目的是什么?
Java Stream API Filter(过滤器)
在Java中找到正数和负数数组元素的数量