VCでDB接続するには?

解決


ケロロ2等兵  2005-03-22 08:18:56  No: 56720

はじめまして、こんばんは  ケロロです。
VCの方は基本的なことしかまだわからず、コンソール上の操作しかしたことがないのですが
過去ログをみてわからなかったので質問させていただきます
DBはAccess2000なのですがコンソール上から検索できる簡単なDB接続というのはVCにはないのでしょうか?
VBとかでしたらOpendatabaseとかでパスを指定したら一発なのですが
VBでしますと元のファイルが200Mなので開くにも時間がかかってしまうので
VCでやってみようと思ったのがきっかけです
電話番号でのあいまい検索から氏名や顧客番号をひっぱりだしてコンソール上に表示ができればとかんがえていますが
DB接続からつまづいてしまっています
DBの接続方法のサンプルなどありましたら教えていただけないでしょうか?
コンソールからはできないとかMFCでの初歩的なことがかかれているHPといったことでもとっかかりを理解していないので
そういったコメントだけでももらえると助かります


Disca  URL  2005-03-22 16:16:04  No: 56721

はじめまして、Discaと言います。

MFC のクラスで、「CDatabase」があります。

http://www.asahi-net.or.jp/~yy6m-wd/kuma/vctip/db.htm
こちらをご参照ください。


ケロロ2等兵  2005-03-22 21:29:10  No: 56722

さっそくのお返事ありがとうございます
今休み時間なので作業をためさせてもらいっていますが、  
参考にさせてもらっているHPのサンプルコードをためさせてもらっているのですが

//基本的なDBのOpen、Close手続き
CDatabase db;
db.OpenEx("DSN=MS Access Database",CDatabase::openReadOnly);  ←  ここでエラー
CRecordset rec(&db);
rec.Open(CRecordset::forwardOnly,"SELECT * FROM テーブル名");
//ここにデータ処理用コードを記述
rec.Close();
db.Close();

db.OpenExでエラーがでるのですが(構文エラー : ';' が '.' の前に必要です。)これはいったいどのような意味なのでしょうか?


Disca  URL  2005-03-23 01:12:21  No: 56723

原因はわかりませんが、

#include <afxdb.h>
はされてますか?


ケロロ2等兵  2005-03-23 02:14:04  No: 56724

#include <afxdb.h>
は貼り付けを間違えてました。
インクルードはしています
してなかったらCDatabase自体とおらないでしょうし
他にもインクルードしないといけないのでしょうか?
それともMFCとかではなくコンソールアプリケーションを選択してcppファイルにそのままつかってしまっていることがまずいのでしょうか?


Disca  URL  2005-03-24 11:19:56  No: 56725

Win32 コンソールアプリケーションを選択した場合、
「アプリケーションの設定」で、サポートの追加「MFC」にチェックを入れます。

MFCにチェックが入っていない場合と、入っている場合を比較してみてはいかがでしょうか?


ケロロ2等兵  2005-03-25 06:45:46  No: 56726

コンソールにもMFCサポートってあったんですね
知りませんでした
さっそくやってみましたが自分には違いがちょっとみわけることができませんでした
違いというよりもファイルが2,3自動でできてるので
そもそもデータソースは一体どこで指定してるのかがわからなかったりします
今日明日はすこしバタバタしてしまいますので、作業の方がすこし遅れぎみになりますが、がんばって調べていきます
何度もお返事いただきありがとうございます


じぶ  2005-04-25 23:27:57  No: 56727

はじめまして、じぶです。

質問が少し前なので、ひょっとしたらもう結論が出てるかもしれませんが、
私はVCでMDBアクセスする際にはCDaoDatabaseクラスをよく使います。
実際にはこんな感じです。

#include <afxdao.h>

CString DatabaseFile = "test.mdb";

// データベースをオープン
CDaoDatabase Database;
TRY{
    Database.Open(DatabaseFile);
}CATCH(CDaoException, e){
    AfxMessageBox("失敗", MB_OK);
    return;
}END_CATCH;

// "テスト"テーブルをオープン
CDaoRecordset Recordset(&Database);
TRY{
    Recordset.Open(dbOpenDynaset, "SELECT * FROM テスト", dbReadOnly);
}CATCH(CDaoException, e){
    AfxMessageBox("失敗", MB_OK);
    Database.Close();
    return;
}END_CATCH;

// レコードセットから情報を取得
TRY{
    // 先頭のレコードへ移動
    Recordset.MoveFirst();
    while(!Recordset.IsEOF()){
        // 1番目のフィールドの値を取得
        COleVariant buf = Recordset.GetFieldValue(0);
        // 次のレコード
        BaseRecordset.MoveNext();
    }
}CATCH(CDaoException, e){
    AfxMessageBox("失敗", MB_OK);
    Database.Close();
    Recordset.Close();
    return;
}END_CATCH;

// 終了
Recordset.Close();
Database.Close();

CDatabaseでも同様の処理はできると思いますが、
CDaoDatabaseクラスの方が、特にMDBを使う場合には
あまり細かな指定がいらないみたいです。

あとTRY〜CHATCH〜END_CATCHの辺は・・・好みで
適用に変えてもいいんじゃないでしょうか。


ケロロ2等兵  2005-04-27 08:42:26  No: 56728

解答ありがとうございます
バタバタしてしまってこっちはなかなかできなかったのですみません
あれから自分の中ではMFCの使い方からはじめないといけないと
思いましてその勉強がひととおりすんでからと(語句だけでも理解できるくらいに)
と思っていたのですがすみません
自分の中ではパスはどこに書くんだろうとかそんな程度のレベルなんです
あとジブさんのコードをコンソールプログラムにはっつけてやってみたのですが
TRYあたりでまず最初に
error C2447: '<L_PROPERTY>' : 関数ヘッダがありません (旧形式の仮引数リスト?)
なるエラーがでたのちに
後は主にRecordset.close()でエラーになってしまいます(構文エラーだったり型指定だったりです  6項目くらいずらずらと)

それで今回せっかく解答をいただいたのですが
VBの方でお聞きしたいことができてしまいましたのでこちらは一時解決済みとさせていただきます
まことにかってながら申し訳ありません
いままで解答くださった方ありがとうございます
またこりずにこの問題にはぶつかっていきたいのでもうすこしまともになりましたら
またお付き合いくださればと思います
どうもすみませんでした


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加