CDaoDatabaseのオープンエラーについて

[戻る]
長谷川 2004/12/01(水) 17:07:05
お世話になります。

CDaoDatabase::Openを使ってAccess2000のファイルをオープン使用としたのですが、エラーに
なってしまいます。
文法的には問題ないようですが、なぜかわかりません。具体的には以下の通りです。

BOOL CFixDbDlg::ConnectDb(CDaoDatabase *pDb)
{
         // pDbは領域確保済
    // データベース接続
    CString sDs;    // データソース

    sDs = "F:\\vc_work\\FixDb\\FixTest.mdb";
    try {
        pDb->Open(sDs, FALSE, FALSE);
    }
    catch (CDaoException e) {
        AfxMessageBox(e.m_pErrorInfo->m_strDescription, 
MB_ICONEXCLAMATION);
        return FALSE;
    }
    AfxMessageBox(_T("データベースに接続しました。"));
    return TRUE;
}

エラーメッセージは以下の通りです。
データベースの形式'F:\vc_work\FixDb\FixTest.mdb'を認識できません。

Access2000では問題なく開くことができるファイルですし、なぜ認識できないのかわかりませ
ん。

修正点がありましたら、ご指摘いただけると幸いです。

よろしくお願いします。

Ban 2004/12/01(水) 19:55:46
多分、DAO が 3.6 になってないと思います。

VC++超初心者会議室(http://www.mtakahashi.com/bbs.htm)の
「12402 データベースACCESS2000からデータを読む」
でちょうど説明してるので参考までに。

wood 2004/12/02(木) 08:01:02
ここの過去ログでも見たことありますが VC6のみ開発環境ですと
ACCESS2000の保存形式MDBに対応していません
ACCESS97保存形式に変換してから使用すれば良いはずです

質問内容には毎回、開発環境を明記しましょう

最低、コンパイラの名称、バージョン、アプリケーション実行OS

Ban 2004/12/02(木) 10:12:02
リンク先を読んでもらえば分かりますが、VC6でもsp3以降ならAccess2000にも対応してます。
ここで問題となるのは VC6 の SP のバージョンですが、販売時点でsp3以降になっている
ことも多いので、単にバージョン指定だけで動く可能性も高いです。

> 質問内容には毎回、開発環境を明記しましょう

御意。

長谷川 2004/12/02(木) 11:09:30
Banさん、woodさん、回答有難うございました。

> 質問内容には毎回、開発環境を明記しましょう
大変失礼しました。
OSはWindows2000、開発環境はVisual C++ V6.0(SP5)です。データベースはAccess2000で
す。

旧バージョン形式に変換したところ、接続できました。
ちなみにAccess2000を使いたい場合は、
AfxGetModuleState()->m_dwVersion = 0x0601;
を記述すればよいということなのですが、CDaoDatabaseオブジェクト生成直前に記述したとこ
ろ、「'm_dwVersion' : 'AFX_MODULE_STATE' のメンバではありません。」というメッセージ
でコンパイルエラーになってしまいました。
何かヘッダーファイルをインクルードする必要があるのでしょうか。

また、SQL Server2000にODBC接続することも視野に入れているのですが、その際、
CDaoDatabase::Open()の引数の値が変わるのはもちろんですが、それ以外に
「AfxGetModuleState・・・」のような設定は必要なのでしょうか。(試してみれば、一番早い
のですが、現状SQL Server2000の環境が身近にないものですから・・・。)

ご教示いらだければ幸いです。よろしくお願いします。

Ban 2004/12/02(木) 11:23:22
> AfxGetModuleState()->m_dwVersion = 0x0601;

だけで動作を変更するには、MFC は動的にリンク(DLL使用)にしないといけません。
多分、静的にリンクする設定になっていると思いますが、その状態だと
実行時にバージョン情報を変えても DAO のバージョンは変わりません。

こっちは試したことがありませんが、静的にリンクするには「MFC の再コンパイル」とか
必要だったと思います。sp の説明にもあったと思いますので参考にしてください。

長谷川 2004/12/02(木) 18:38:16
Banさん、回答有難うございます。

静的リンク、ややこしそうですね。
動的リンクというのはLoadLibraryを使う手法ですよね?だとすると、引数にDLL名を設定する
必要があるかと思いますが、今回の場合はdao360.dllでよいのでしょうか。

Ban 2004/12/02(木) 19:30:49
> 動的リンクというのはLoadLibraryを使う手法ですよね?だとすると、引数にDLL名を設定する

書き方が悪かったです。単に「プロジェクトの設定」で「共有DLL で MFC を利用」にするだけです。

wood 2004/12/03(金) 00:06:16
余談です

無償で利用可能なSQL SerVer2000環境の構築
http://www.microsoft.com/japan/msdn/vstudio/msde/installing.asp
http://www.microsoft.com/downloads/details.aspx?FamilyID=413744d1-a0bc-479f-
bafa-e4b278eb9147&displaylang=ja

使い方はバージョン違うけどこちらを参照してください
http://www.ki.rim.or.jp/~kuro/MSDE/index.html

ODBC接続で利用する場合、ODBCアドミニストレータに構築したデータベースを
登録すれば、VC6で利用可能です

http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200303/03030134.txt
もご参考にしてもらえると良いかも

長谷川 2004/12/03(金) 10:27:10
Banさん、woodさん回答有難うございました。

Banさん:
教えていただいた通り、共有DLLでMFCを利用するように変更したのですが、変化なしです。前
回と同じエラーメッセージが出力されます。まだ何か設定が必要なのでしょうか?

woodさん:
MSDEって、そういう機能を持ったものだったのですね。今頃知りました(恥)。
SQL ServerのEnterprise Managerがないようなものだと考えればよいのでしょうか。また
Enterprise Managerのような機能もどこかにあるのでしょうか。(テーブル作成等に毎回SQL文
を打ち込むのも大変なので。)

よろしくお願いします。

Ban 2004/12/03(金) 10:42:20
> まだ何か設定が必要なのでしょうか?

私のときの問題はそれだけでした。

「'm_dwVersion' : 'AFX_MODULE_STATE' のメンバではありません。」
で google 検索しても、ほぼ同様の回答になってますし(↓検索結果)

http://www.hey-to.net/ML-archive/vcppML/2000/msg00500.html
http://mtakahashi.com/old/05125.html

SP の説明ページに書いてあることが全部できていれば問題ないと思います。

可能性としては、ですが、
意図的に DAO3.6 が入ってないとか、
他にリンクしてるライブラリがあってそちらが静的にリンクしようとするとか、
....ちょっと分かりかねますね。すみません。

Ban 2004/12/03(金) 11:26:31
# SQL Server 2000 のサーバライセンスと CAL があれば、
# SQL Server 2000 Enterprise Manager を使っても問題ないらしいですが、
# 当然 MSDE にはついてません。
# MSDE Manager 等のサードパーティ製ツールはありますし、
# (機能的にどうかは知りませんが)フリーの奴も探せばぽろぽろあります。
# あと、機能面以外でも利用形態によるライセンス的な制限や対応接続数などの違いがありますので、
# 公開が前提だったりすると注意が必要かもしれません。

長谷川 2004/12/03(金) 12:05:54
[[解決]]
Banさん有難うございます。

とりあえずAccessの旧バージョン形式でやってみます。

MSDE自体はツールのテスト用に使うつもりで、公開は考えていません。

長期にわたり対応本当に感謝します。

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