OLE DB コンシューマ テンプレートクラス(CDataSource, CSession, CAccessor, ...)
を使用したデータベース処理を行うプロジェクトを作成しております。
処理自体は完成したのですが、分からないことが出てきました。
WindowsAPIを使用したアプリケーションならば、エラー発生時はGetLastError()を
呼び出して得られたコードをFormatMessage()で変換すればエラーメッセージが取得
できます。
(例) ERROR_FILE_NOT_FOUND(= 2)なら、
「指定されたファイルが見つかりません。」
同様にOLE DBでもエラーメッセージを取得したいのですが、ざっと探した限りで
取得方法が見つかりません。
ご存じの方がいましたら、よろしくお願いいたします。
HRESULTを返却される。
ということでいいんですかね?
http://msdn.microsoft.com/ja-jp/library/f9k758da%28v=vs.90%29.aspx
とか。
HRESULT自体はwinerror.hにある程度記述されています。
追加のエラーとかある場合は関連するヘッダファイルに書かれているんじゃないでしょうか?
HRESULTからメッセージに変換したい。というのであれば…検索してみると
http://blog.firefly-vj.net/blog/2008/05/11/Get-errmsg-from-hresult/
とか見つかります。
そんなワケで、そのままFormatMessage()に突っ込んでみてはどうでしょうか?
http://msdn.microsoft.com/ja-jp/library/cc428939.aspx
FORMAT_MESSAGE_FROM_HMODULEを指定してモジュールハンドルを指定する必要がある…かも
知れませんが。
# OLE DBで使用しているDLLなりを指定する必要があるかも知れない…と。
HRESULT値もFormatMessage()で変換できるんですね。
早速やってみました。
CDataSource::OpenFromInitializationString()
でわざと接続文字列を間違えてエラーしてみた結果、
HRESULT値が E_FAIL でした。
うーん、接続失敗したという情報以上のものではないですねぇ。
もう少し詳しい情報が得られる方法がないか調査してみます(^^)
> もう少し詳しい情報が得られる方法がないか調査してみます(^^)
ODBC_SDKのAPIでいう「SQLError」みたいな関数はないですか。
結構詳しいです。
アクセスだと確か、日本語です。
ありがとうございます。
探してみたら、CDBErrorInfoというクラスが見つかりました。
もしかすると、これが答なのかもしれません。
引き続き調査してみます。
補足、
ODBCの場合、基本的な接続エラー等は別として、エラーは確か各DBに
依存していたと思います。
アクセスの場合は日本語、オラクルの場合はエラー番号だったと思います。
皆さん、ありがとうございました。
CDBErrorInfo::GetAllErrorInfo()で、無事、詳細メッセージが得られました。
コードは長くなるので省略しますが、
要は atldbcli.h の AtlTraceErrorRecords() 内のコードの丸写しです。
以下のような初期化文字列を与えて、
Provider = Microsoft.Jet.OLEDB.4.0; Data Source = AAA.mdb
以下のようなエラーコードが得られます。
「ファイル 'AAA.mdb' が見つかりませんでした。」
クローズ忘れました(^-^;