CDaoDatabaseを使用してAccess2000で作成したデータベースにアクセスする
プログラムを作っていまして、参照1のようなプログラムを組みました。
プロジェクトは、「Win32ConsoleApplication」-「空のプロジェクト」で作成し、
作成後、「プロジェクトの設定」画面で、MicrosoftFoundationClass(M)を
「共有DLLでMFCをしよう」に設定しました。
これだと、Access2000で作成したものは読めなかったので、
「MicrosoftAccessの旧バージョンのデータベースに変換」メニューを選択して、
変換したら読めるようになりましたが、問題が1つ残ってしまいました。
データベースを旧バージョンに変更前でも、後の場合でも、プログラム終了時に
エラーメッセージが出てきます。(参照2)
Releaseモードでやった場合には出てきませんでした。
これはどうして出てきてしまうのでしょうか?
Debugモードで出て、Releaseモードだとでない…。なぜなのでしょうか?
Debugモードの時は必ずでるというわけではないと思うのですが…。
参照1
#include <afxdao.h>
#include <windows.h>
void main()
{
CDaoDatabase db;
try
{
db.Open(_T(test3.mdb), FALSE, TRUE);
}
catch(CDaoException *e)
{
e->Delete();
return;
}
db.Close();
}
参照2
Debug Assertian Failed!
Program:C:\DB\DB.exe
File:daocore.cpp
Line:42
For infomation on how program can cause an assertion failure,
see the Visual C++ documentation on asserts.
> File:daocore.cpp
> Line:42
この行のコメントに、
// ... you've not shut down with a call AfxDaoTerm()
と書いてありますから、
終わる前にAfxDaoTerm()を呼び出してみてはいかがでしょう。
dairygoodsさん、レスありがとうございます。
daocore.cppのファイルが無いと(Cの標準関数が書かれたソースみたいに)思っていたので
検索していませんでした。
で、早速検索してソースを見たところ「ASSERT(m_pDAODBEngine == NULL);」とありました。
AfxDaoTermもヘルプで見たところ、
「DAO データベース エンジンを終了します。通常、この関数を呼び出す必要があるのは、正規
の DLL だけです。アプリケーションは、必要に応じて AfxDaoTerm を自動的に呼び出しま
す。」(MDSNより)
MFCベースでプログラムを組んでいない場合は、
AfxDaoTermを呼び出さないといけないのかな?
AfxDaoTermをつけた場合は、エラーは出ませんでしたが、
AfxDaoTermをつけない場合で、Releaseモードの時は自動的に
呼び出されるのでエラーがでないということなのでしょうか?
この辺り、分かる方いましたら助言等お願いいたします。
>AfxDaoTermをつけない場合で、Releaseモードの時は自動的に
>呼び出されるのでエラーがでないということなのでしょうか?
助言では有りませんが、知っている事を判る範囲でお伝えします
ASSERT() は(大文字なので分ると思いますが)マクロで、_DEBUG が有効な場合に有効に
なるものです。ですから Release ビルドでは(普通は _DEBUG が未定義なので)アサート
(アサーション)に引っ掛りません
> daocore.cppのファイルが無いと(Cの標準関数が書かれたソースみたいに)思っていたので
> 検索していませんでした。
Debug Assertian Failed!
のダイアログで「再試行」を押すと、
ソースがあれば該当の行が表示されますよ。
> AfxDaoTermをつけた場合は、エラーは出ませんでしたが、
> AfxDaoTermをつけない場合で、Releaseモードの時は自動的に
> 呼び出されるのでエラーがでないということなのでしょうか?
ASSERTはバグの検出を行うために使われます。
バグが無くなれば、チェック処理は不要ですので、
Releaseビルドでは、チェックされません。
(チェックされないから問題が無くなるわけではありません。
その代わり、エラーも出ないが何だか上手く動かない
検出困難なバグになってしまいます。)
レス遅れてすいません。
ということは、AfxDaoTermを呼べば問題無いということでしょうか?
> ということは、AfxDaoTermを呼べば問題無いということでしょうか?
問題無いと思います。
dairygoodsさん、島さん
ありがとうございました。