スレッド変更 : DBアクセス時に、データソースの選択ダイアログ が表示されるのは何故ですか?

[戻る]
Takeshi 2002/05/09(木) 11:57:13
■動 作 環 境 :WindowsNT4.0 or Windows2000
■開 発 環 境 :Visual C++6.0(SDI形式・MFC使用)
■データベース:Access2000(ODBC接続)

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
  お世話になっております。

以前、同内容のスレッドを作成しましたが非常に長くなったのと、
障害状況が分かり難くなった為に新規に作成します。

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
Microsoft Access2000を使用してデータベースを作成しました。
データベースは複数のテーブルを持ち、メインのテーブルは他のテーブルを参照しています。

Visual C++6.0を使用して、フォーム上のコントロールにより文字列を構築し、
その文字列を使ってSQL文で該当するレコードセットを抽出しています。

しかし、データベースへアクセスする度に「データソースの選択」ダイアログが表示される為、
毎回データソースファイル(.dsn)をマウスで選択するという操作をしています。

表示されるダイアログは、二枚のタブ(ファイルデータソース、コンピュータデータソース)を
持っており、ファイルデータソース・タブには該当するデータソースファイル(.dsn)が
存在するフォルダが展開されています。ここで、ファイルを選択すると

  DNS名(D): MS Access Database

というODBCに設定されているデータソースファイル(.dsn)が表示されて、OK 押下により
データベースがオープンされます。これはデータベースとのアクセスの度に行います。

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
  次にレコードセットをオープンしている記述を載せておきます。

MyRecordset.Open
(CRecordset::snapshot,"select Field1 from Table1",CRecordset::readOnly);

MSDN等で調べたり、ここでのアドバイスも色々頂きましたが原因が分かりません。
オープンに必要な情報が不足していたり、ダイアログ表示を要求する引数を付与すれば
ダイアログが表示されるのですが、この場合は表示を要求していません。

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
以下はデータソースファイルの内容です。

[ODBC]
DRIVER=Microsoft Access Driver (*.mdb)
UID=admin
UserCommitSync=Yes
Threads=3
SafeTransactions=0
PageTimeout=5
MaxScanRows=8
MaxBufferSize=2048
FIL=MS Access
DriverId=25
DefaultDir=F:\VC++\MyProject
DBQ=F:\VC++\MyProject\MyDatabase.mdb

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

  こういった現象に遭遇された方、解決のヒントを持っておられる方がおられましたら
アドバイスをお願いしたいです。宜しくお願いします。

みみみ 2002/05/09(木) 15:10:16
この環境ならVS6.0sp4が最低限必要な気がしますが大丈夫ですか・・・。
(もしだめならoffice2000sp2→Win2000sp2をインストールしてはどうでしょう)

不良PG [E-Mail] 2002/05/09(木) 16:02:18
みみみさんがおっしゃっているサービスパックも気になりますが、

私がACCESS2000のデータベースをODBCでVC6からアクセスする場合には、
データソースファイルを記述した覚えがまったくありません。

正しくVC6とMDAC(Microsoft Data Access Component)とAccess2000がインストールされて
いればコードのみで使用できるはずなのですが・・

如何でしょう?


同様の内容の別スレッドは、ちょっと・・

Takeshi 2002/05/09(木) 17:17:20
  どうも、お世話になっております。

 → 不良PGさんへ

「データソースファイルを記述しない」と言うのは、

  MyDatabase.OpenEx ("DSN=MS Access Database",CDatabase::openReadOnly);

上のコードで私が書いているように、データベースの Open関数でデータソースを
指定しないという事なんでしょうか?

すいませんが、「コードのみ」の意を教えて下さい。

不良PG [E-Mail] 2002/05/09(木) 17:31:31
>MyDatabase.OpenEx ("DSN=MS Access Database",CDatabase::openReadOnly);
>上のコードで私が書いているように、データベースの Open関数でデータソースを
>指定しないという事なんでしょうか?
データソースの指定は、必要です

データソースファイルの内容を変更しなかったということです・・

コードのみとは・・
VCのソースコードのみという事です
(当然データベースファイルは、作成しましたが・・)

要は、
>DefaultDir=F:\VC++\MyProject
>DBQ=F:\VC++\MyProject\MyDatabase.mdb
これは、ソースコードに書けば必要ないのでは?という事です

第3水準 2002/05/09(木) 17:42:10
CRecordsetクラスのインスタンスを作る際の、
コンストラクタに渡す引数はどうしていますか?

CRecodsetクラスのコンストラクタは
CRecordset::CRecordset( CDatabase* pDatabase = NULL);
となっていますが、
このpDatabaseにNULLを渡すか、
ちゃんとした値を渡しても、pDatabaseがOpenしていないと、
CRecordsetのOpen時に、件のダイアログらしきものが出てきます。
詳細はMSDNに載っています。

例えば
CRecordset MyRecordset;
のように変数宣言をしていると、MyRecordsetのOpen時にダイアログが出ます。

Takeshi 2002/05/09(木) 19:07:15
[[解決]]
  いつもお世話になっております。

すいませんでした、第三水準さん のご指摘の通り引数無しで構築しておりました。
そういう事だったんですね。ありがとうございました、助かりました。
いつも手を煩わせて申し訳ないです。スレッド解決です。

  ※他の人の為にも、修正したコードを動作例として載せます。

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

// データベース型OBJ(MyDatabase)を構築
CDatabase MyDatabase;

// データベース型OBJへのポインタ(MyDB_p)を宣言
CDatabase* MyDB_p;

// ポインタ(MyDB_p)にデータベース型OBJ(MyDatabase)のアドレスを設定
MyDB_p = &MyDatabase;

// データベース型OBJへのポインタを引数としてレコードセット型OBJ(MyRecordset)を構築
CRecordset MyRecordset(MyDB_p);

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

後は、構築したレコードセット型OBJを使ってデータベースを参照・更新等ができます。

                                                             以上

臨時の先生 2002/05/09(木) 19:24:14
よろしければ以下のようにしなかった理由を教えていただけませんか?
 CDatabase MyDatabase;
 CRecordset MyRecordset(&MyDatabase);

Takeshi 2002/05/10(金) 09:17:23
  えー、すいません。

明確な理由は無いです。引数がポインタなので、ポインタ変数を使っただけです。
特にポインタを宣言しなければならない理由はありませんね。

という事は、つまりポインタの乱用って事ですかね?
気をつけます。

                                          以上

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