是来自MARS的ODBC,但来自VENUS的ADO/OLEDB?

问题描述:

简短问题: 我发现我需要在ODBC上使用MARS,但不能在ADO/OLEDB上使用,对吗?是来自MARS的ODBC,但来自VENUS的ADO/OLEDB?

更详细的解释:

我刚刚发现我的ODBC代码(使用 “驱动程序= {SQL本机客户端}”,MFC的CDatabase代码)需要具有MARS( “MARS_Connection = YES;”),因为,虽然我做的在打开RecordSet时不会发出多个SELECT,我会获取一批行,然后需要打开另一个RecordSet来发出一个新的SELECT,然后返回到下一批次的第一个RecordSet。没有MARS,我得到ODBC错误“连接忙于另一个命令的结果”。一切都很公平。

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

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

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

如果您需要多个并发记录集,使用ODBC很容易,因为如果您不使用MARS,那只是错误,如上所述。

但是,使用ADO/OLEDB更加微妙。当我不使用MARS时,多个RecordSets似乎只能正常工作。但是,在封面之下,ADO会自动为每个会话打开另一个新会话,但您不知道它并且无法分辨。事实证明,这是非常缓慢的,因为每个会话都需要关闭一个完整的审计登录&,并且我一直在创建,关闭和重新创建。

因此,我为ADO放置了“MARS Connection = True”,现在它的行为就像ODBC一样,重新使用现有连接而不是创建新连接。

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