简短的问题:
我发现我需要在ODBC上使用MARS,而不是在ADO/OLEDB上使用MARS,对吗?
更长的解释:
我刚刚发现我的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时,多个RecordSet似乎可以正常工作。但是,在幕后,发生的是ADO为每个 session 自动打开了另一个新 session ,但是您对此一无所知,也无法告知。事实证明,这确实很慢,因为每个 session 都需要完整的审核登录和注销,而且我一直都在创建,关闭和重新创建。
因此,我为ADO输入了“MARS Connection = True”,瞧,它现在的行为就像ODBC,重新使用现有的连接而不是创建新的连接。
因此,道理是:您必须拥有适用于ODBC的MARS,而ADO/OLEDB则可以通过做自己的事情而允许多个并发RecordSet而不使用MARS,但这可能(不是)您想要的/最好的。