7

簡単な質問: ADO/OLEDB ではなく、ODBC では MARS を使用する必要があると思いますが、正しいですか?

より長い説明:

ODBC コード (「Driver={SQL Native Client}」、MFC CDatabase コードを使用) に MARS (「MARS_Connection=yes;」) が必要であることを発見しました。行のバッチをフェッチし、別の RecordSet を開いて新しい SELECT を発行し、次のバッチのために最初の RecordSet に戻る必要があります。MARS がないと、ODBC エラー「別のコマンドの結果で接続がビジー状態です」が発生します。すべて十分に公平です。

ただし、私のコードは、ODBC ではなく ADO/OLEDB ("Provider=SQLNCLI", #import msado15.dll) と同じように動作します。同じ状況で、「MarsConn=yes」を指定する必要はありませんでした。

私は混乱しています/驚いています。これは正しいですか、期待どおりですか、それとも何か不足していますか?

4

1 に答える 1

6

誰かが興味を持っているなら、私は問題/違いが何であるかを知りました. ADO のケースに微妙な問題があり、それが関連していることが判明したため、コードを再検討する必要がありました。

複数の同時 RecordSet が必要な場合、ODBC を使用すると簡単です。MARS を使用しないと上記のようにエラーになるだけだからです。

ただし、ADO/OLEDB の場合は、より微妙です。MARS を使用しない場合、複数の RecordSet が問題なく動作するようです。しかし、内部では、ADO がセッションごとに別の新しいセッションを自動的に開きますが、それについては知らず、わかりません。各セッションには完全な監査ログオンとオフが必要であり、作成、終了、および再作成を常に行っているため、これは非常に遅いことがわかりました。

そこで、ADO に「MARS Connection=True」を設定すると、見よ、ODBC と同じように動作し、新しい接続を作成する代わりに既存の接続を再利用するようになりました。

したがって、教訓は次のとおりです。ODBCは MARS が必要ですが、ADO/OLEDB は独自の処理を行うことで MARS を使用せずに複数の同時 RecordSet を許可しますが、それは (まあ) あなたが望むもの/最善のものではないかもしれません。

于 2010-05-19T16:03:57.270 に答える