CDaoDatabaseにて – プログラミング – Home

通知
すべてクリア

[解決済] CDaoDatabaseにて


奈々氏
 奈々氏
(@奈々氏)
ゲスト
結合: 22年前
投稿: 4
Topic starter  

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.


引用未解決
トピックタグ
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

> File:daocore.cpp
> Line:42

この行のコメントに、
// ... you've not shut down with a call AfxDaoTerm()
と書いてありますから、
終わる前にAfxDaoTerm()を呼び出してみてはいかがでしょう。


返信引用
奈々氏
 奈々氏
(@奈々氏)
ゲスト
結合: 22年前
投稿: 4
Topic starter  

dairygoodsさん、レスありがとうございます。

daocore.cppのファイルが無いと(Cの標準関数が書かれたソースみたいに)思っていたので
検索していませんでした。

で、早速検索してソースを見たところ「ASSERT(m_pDAODBEngine == NULL);」とありました。
AfxDaoTermもヘルプで見たところ、
「DAO データベース エンジンを終了します。通常、この関数を呼び出す必要があるのは、正規
の DLL だけです。アプリケーションは、必要に応じて AfxDaoTerm を自動的に呼び出しま
す。」(MDSNより)

MFCベースでプログラムを組んでいない場合は、
AfxDaoTermを呼び出さないといけないのかな?

AfxDaoTermをつけた場合は、エラーは出ませんでしたが、
AfxDaoTermをつけない場合で、Releaseモードの時は自動的に
呼び出されるのでエラーがでないということなのでしょうか?
この辺り、分かる方いましたら助言等お願いいたします。


返信引用
島
 島
(@島)
ゲスト
結合: 23年前
投稿: 238
 

>AfxDaoTermをつけない場合で、Releaseモードの時は自動的に
>呼び出されるのでエラーがでないということなのでしょうか?

助言では有りませんが、知っている事を判る範囲でお伝えします
ASSERT() は(大文字なので分ると思いますが)マクロで、_DEBUG が有効な場合に有効に
なるものです。ですから Release ビルドでは(普通は _DEBUG が未定義なので)アサート
(アサーション)に引っ掛りません


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

> daocore.cppのファイルが無いと(Cの標準関数が書かれたソースみたいに)思っていたので
> 検索していませんでした。

Debug Assertian Failed!
のダイアログで「再試行」を押すと、
ソースがあれば該当の行が表示されますよ。

> AfxDaoTermをつけた場合は、エラーは出ませんでしたが、
> AfxDaoTermをつけない場合で、Releaseモードの時は自動的に
> 呼び出されるのでエラーがでないということなのでしょうか?

ASSERTはバグの検出を行うために使われます。
バグが無くなれば、チェック処理は不要ですので、
Releaseビルドでは、チェックされません。
(チェックされないから問題が無くなるわけではありません。
 その代わり、エラーも出ないが何だか上手く動かない
 検出困難なバグになってしまいます。)


返信引用
奈々氏
 奈々氏
(@奈々氏)
ゲスト
結合: 22年前
投稿: 4
Topic starter  

レス遅れてすいません。

ということは、AfxDaoTermを呼べば問題無いということでしょうか?


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

> ということは、AfxDaoTermを呼べば問題無いということでしょうか?

問題無いと思います。


返信引用
奈々氏
 奈々氏
(@奈々氏)
ゲスト
結合: 22年前
投稿: 4
Topic starter  

dairygoodsさん、島さん
ありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました