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

JB1*_*JB1 7 oledb odbc ado recordset sql-server-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".

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

JB1*_*JB1 6

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

如果你需要多个并发RecordSet,那么使用ODBC很容易,因为如果你不使用MARS,它只是错误,如上所述.

然而,使用ADO/OLEDB,它更加微妙.当我不使用MARS时,多个RecordSet似乎工作正常.但是,在幕后,会发生什么是ADO自动为每个会话打开另一个新会话,但你不知道它并且无法分辨.这原来是很慢的,因为每个会话都需要一个完整的审核登录和关闭,我创建,关闭,并重新创建所有的时间.

所以我把"火星连接=真"为ADO,不料&你看,它现在的行为就像ODBC,重新使用现有的连接,而不是创建新的.

所以,道德是:你必须有火星ODBC,ADO时/ OLEDB将允许在不MARS多个并发的记录做自己的事,但它可能(也)不是你想要/最好的东西.