CRecordsetのOpenエラーBOX抑制

[戻る]
シエル 2006/01/31(火) 09:39:30
タイトルの通り、CReordsetのOpen時のエラーBOX表示を抑制したいです。
詳しくいいますと、リモートPCのAccessのmdbにODBCでアクセスしています。
コレ自体はうまくいってますが、エラー時の処理を作ってる時につまずきました。
例外が発生する場合などはtry…catchで独自のエラー処理ができますが、
ネット越しでOpenしようとしたときに回線を切っていると
例外が発生せずにMFC?がODBC Microsoft Accessドライバログイン失敗
というタイトルでディスクまたはネットワークのエラーですという
メッセージボックスを出します。それを閉じるとOpenがFALSEを返します。
このBOXが出ると閉じるまで処理が止まってしまうので困ります。
なんとかこのBOXが出ない方法を知っている方いませんか?
どうかご教授ください。
環境はXPでVC6です。

シエル 2006/01/31(火) 13:39:33
自分で調べててわかってきました。
::SQLDriverConnectと言う関数の中で呼ばれてるみたいです。
これの第2引数をNULLにすればBOXが出なさそうですが
MFC内部で呼ばれているために手が出せません。
こういう場合はAPIで自分で作るしかないのでしょうか?
いまから一から作るのは大変です。
MFCの一部関数を改造できないものでしょうか?

REE 2006/01/31(火) 14:01:05
その::SQLDriverConnectを呼んでいる関数を自分で直接呼んでいる場合、
または、その呼んでいる関数が仮想関数の場合であれば、
継承して、その関数だけ上書きできます。

シエル 2006/01/31(火) 14:08:36
[[解決]]
レスありがとうございます。
肝心のMFCの関数はConnectという関数でして
自分で読んだMFC関数Openの中で呼ばれています。
ヘッダを見るとvirtualがついてないようなので
仮想関数でないですよね??
改造無理そうならAPIでつくるしかないですね…

シエル 2006/01/31(火) 15:09:16
すいません。直接APIよんでもBOX出るようです…

ITO 2006/01/31(火) 15:44:00
「ODBC Microsoft Accessドライバログイン失敗」
は、多分Microsoft AccessのODBCのドライバ-のエラーです。
それは、多分SQLシテートメントをドライバーが実行しようとしたときに
接続が切れたために表示されたものだと思います。
まだ、「Access」は親切なのでいいです。
他のドライバーたとえば「オラクル」などではエラー番号のみで
メッセージなどがでないときもあります。
このエラーの回避は、
  毎回「CDatabase」の「Open」、 「CReordset」の「Open」
    「CReordset」の「Close」、「CDatabase」の」Close」
  を繰り返すしかないと思います。
あと、シエルさん
アプリが終了するまで、CDatabaseでOpenしっぱなしになってませんか?
そうだとすると、相手先データベースが、絶えず接続状態
 になっていて良くないです。
「オラクル」や「SQLServer」のようなサ−バ対応ならまだしも、
「Access」は、サーバ対応ではないです。
一回の通信が終わるつどきちんと「CDatabase」の「Close」
をしたほうがいいと思います。

シエル 2006/01/31(火) 16:07:54
レスありがとうございます。
エラーの原因はわかってまして、
毎回オープンクローズはしております。
問題はこのエラー発生時にBOXが出ることです。(ポップアップで)
無人のPCにて処理を行っていますので
エラーの間(相手が落ちている場合とか)はリトライを繰り返し、
相手が復旧したら自動で通常処理に戻りたいです。
しかし、BOXがでることでオペレータの介入が必要なので
BOXではなくただエラーを返してくれえればありがたいです。

ITO 2006/01/31(火) 16:58:15
回線を切っているとき、「CDatabase」の「Open」でエラーがかえってきませんか?

GetConnet()で調べる方法もあると思いますがどうでしょうか。
「ODBC Microsoft Accessドライバログイン失敗」のウインドウを消すには、
Microsoft AccessのODBCのドライバ-を調べないと解決できないと思います。

シエル 2006/01/31(火) 17:34:00
[[解決]]
レスありがとうございます。
CDatabaseのOpenでエラーがかえってきますが
かえる前にドライバーがエラーBOXをだします。

ついさっきCDatabase::noOdbcDialogを指定すると
エラーBOXが出ずに例外が発生することがわかりました。
これで解決かどうかはわかりませんが
色々試して見ます。

古いスレッドには追加発言できません。