何故データソースを手動で指定しないといけないのですか?

[戻る]
Takeshi 2002/04/25(木) 10:24:20
■動 作 環 境 :Windows2000
■開 発 環 境 :Visual C++6.0(ODBC接続)
■データベース:Access2000

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

CRecordsetクラスを使用せずに、ODBC でデータベースにアクセスしています。

// データベース型OBJの宣言
CDatabase MyDatabase_DB;

// データベースを開く(データソース,,読取専用,接続文字列,カーソルDLL不使用)
MyDatabase_DB.Open
(NULL,FALSE,TRUE,"ODBC;DSN=MS AccessDatabase;DSQ=my.mdb",FALSE);

というコードでやっていますが、
実行するとデータソースを指定させるダイアログボックスが表示されます。
手動でファイルを選択すれば、正常にオープンできるのですが
MSDNライブラリ によれば、第4引数の[接続文字列]にデータソース名(DSN)を指定すれば
第1引数の[データソース名]には NULL を指定しても良いとなっています。 
しかしながら、ユーザーがデータソースを選択したい場合もここ(第1引数)を
 NULL にしなさいと言っています。

逆に、第4引数を "ODBC;" にして、第1引数に"DSN=MS AccessDatabase;DSQ=my.mdb"
を設定すれば、「データソース名および指定された規定のドライバが見つかりません」
という警告メッセージが出て、テーブルのデータは表示されませんでした。

こういう場合はどちらに記述したら良いのでしょうか?

dairygoods 2002/04/25(木) 11:37:08
> MyDatabase_DB.Open
> (NULL,FALSE,TRUE,"ODBC;DSN=MS AccessDatabase;DSQ=my.mdb",FALSE);

DSQではなくDBQです。

Takeshi 2002/04/25(木) 12:00:30
  お世話になります。

駄目ですね、DSQ → DBQ にしても同様でした。
何か良い方法はないのでしょうか?

不良PG [E-Mail] 2002/04/25(木) 12:07:01
>DSN=MS AccessDatabase

DSN=MS Access Database


>こういう場合はどちらに記述したら良いのでしょうか?
どちらに記述しても同じです。

wood 2002/04/25(木) 12:20:49
コントロールパネルのODBCデーターソース設定すれば改善されませんか
的外れならごめんなさい

Takeshi 2002/04/25(木) 13:21:21
  不良PGさんへ

私のコピー&ペーストのミスです。
実際のコードには、DSN=MS Access Database でスペースがあります。


  woodさんへ

ユーザーDSN に MS Access Database が設定されています。
ただ聞いてくるダイアログボックスはファイルDSN を聞いてきてるような感じなんですよ。

ユーザーDSN を設定したら、それで OK なんですよね?

Takeshi 2002/04/25(木) 17:02:08
  お世話になってます。

ダイアログボックスがデータソースの指定を求めてきたとして、
そこでファイルを指定してやるとちゃんとレコードを読み込むという事は、
CRecordset はちゃんとオープンされてるって事ですよね?

でも、何故かダイアログが出てきてしまう。
どうすればこの入力をスキップできるのでしょうか?

第3水準 2002/04/25(木) 17:41:15
的外れかもしれませんが、
mdbファイルをフルパスで指定してみたらどうでしょうか?

Takeshi 2002/04/25(木) 17:57:04
  お世話になっております。

それって Openの文を直すって事ですか?

My_DB.OpenEx
("DSN=MS Access Database;DBQ=F:\VC++\My.mdb",CDatabase::openReadOnly);

第一引数のデータソース部分に DBQ も指定して、パスを入れるんですよね?
これをやるとエスケープシーケンス(\)の警告になりますが、いいんですかね?

やっても同じでした。例のダイアログが出てきますね。
すんません・・・。

不良PG [E-Mail] 2002/04/25(木) 18:13:36
>第一引数のデータソース部分に DBQ も指定して、パスを入れるんですよね?
>これをやるとエスケープシーケンス(\)の警告になりますが、いいんですかね?
警告が出て良いわけないでしょう・・

>("DSN=MS Access Database;DBQ=F:\VC++\My.mdb",CDatabase::openReadOnly);
("DSN=MS Access Database;DBQ=F:\\VC++\\My.mdb",CDatabase::openReadOnly);
この辺りは、基本です、エスケープシーケンスを調べましょう

wood 2002/04/25(木) 18:15:45
>ただ聞いてくるダイアログボックスはファイルDSN を聞いてきてるような感じなんですよ。
ファイルDSN は入力してみたんですか

Takeshi 2002/04/26(金) 10:07:15
  お世話になってます。

コントロールパネルのデータソース(ODBC)の設定は、

▼ユーザーDSN に MS Access Database   Microsoft Access Driver(*.mdb)
やら、dBASE やら色々設定されていました。

▼システムDSN にネットワークの Microsoft ODBC For Oracle (これは関係無いですよね)

▼ファイルDSN に 該当するデータソースのあるディレクトリが展開されていて、
  データソースファイルもそこに表示されています。

という事は、設定は正常になされているという事ですよね。

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

  そうですね、¥を使用する時は ¥¥と表記するんでしたね。忘れていました。
すいません。しかし、DBQでフルパスを指定してもダイアログが出ました。

ダイアログが表示されて、ファイルを選択さえすればちゃんとレコードを読めるんであれば
単純に何かの設定の問題ですよね?その方法を知らないだけで・・・。

こういう疑問って皆さんお持ちになるんでしょうか?

Takeshi 2002/04/26(金) 11:29:19
  お世話になっております。

OpenExの第二引数の設定に、CDatabase::noOdbcDailog というオプションがあります。
これを指定すればダイアログを強制的に表示しないようにできるのですが、

Debug Assertion Failed! となってエラーになります。
エラーの場所は dbcore.cpp というファイルです。

BOOL CDatabase::OpenEx(LPCTSTR lpszConnectString, DWORD dwOptions)
{
    // Exclusive access not supported.
→  ASSERT(!(dwOptions & openExclusive));

この矢印部分でエラーになっているんですが、
OpenEx のオプションの指定が間違っているという意味なんでしょうか?

  ちなみに、OpenExの第一引数の接続文字列を NULL にしても
同様にダイアログの表になってしまいます。このあたりの動作は
接続文字列を設定した場合と変わらないような感じなんです。
どこか別の場所で、接続文字列を無効にするような設定になっているのでしょうか?

sugar 2002/04/26(金) 11:39:08
> ダイアログが表示されて、ファイルを選択さえすればちゃんとレコードを読めるんであれば
> 単純に何かの設定の問題ですよね?その方法を知らないだけで・・・。
>
ダイアログが出るということは、接続に必要な情報が全てそろっていない、
ということを意味するのだと思います。
そして、そのダイアログからファイル(多分mdbファイルのことですよね?)を指定すると、
接続が成功する、ということは、ファイルの指定方法に何か問題があるのだと思います。

例えばMy.mdbをもっと単純なところ(Cドライブ直下など)に置いて
試してみてはどうでしょう?

Takeshi 2002/04/26(金) 11:52:27
  お世話になっております。

sugerさん、こんにちは。
いや、ダイアログが指定を要求してくるのは(mdb)ではなく(dsn)なんです。

(dsn)も(mdb)も VC++\MyProject\Debug\ に置いてます。
だからデバッグ時の実行ファイルと同一 Dir なんです。

なんだか、完全にお悩み状態ですわ。

PATIO 2002/04/26(金) 13:32:35
デバッガで動かしているなら、通常はカレントディレクトリはプロジェクトフォルダに
なります。特別なんか指定していれば、話は別ですけれど。
ですから、Debugの下においてもカレントディレクトリとはならないと思いますが。

Takeshi 2002/04/26(金) 15:18:20
  そうですね。Myprojectの直下に置いてました。
Debugには中間ファイルだけですね。
ただ、どちらにしても問題解決には至っていません。
ファイルを置いているディレクトリは関係無いようです。

sugar 2002/04/26(金) 16:47:39
> いや、ダイアログが指定を要求してくるのは(mdb)ではなく(dsn)なんです。
>
ちなみに、このdsnファイルの内容は、どうなっているのですか?

Takeshi 2002/04/26(金) 16:53:19
  毎度お世話になっております。

いやあ、なかなかうまく行きませんね。
dsnファイルの内容は以下通りです。

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
[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
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
どこかおかしいでしょうか?
DefaultDir も DBQ も合っているはずなんですが・・・。

sugar 2002/04/26(金) 18:40:15
このdsnファイルを指定すると正しく動くわけですよね?
で、Open関数で渡している設定だとダメ。
違いはどんなことがありますか?

ドライバは同じですか?
指定しているmdbファイルは?
その他の設定はどうでしょう?

コンパネのODBCから「MS AccessDatabase」の設定と比較してみてください。

Takeshi 2002/04/30(火) 10:11:32
  お世話になっております。


そうですね、ダイアログ指定であれば正常に動き、
CDatabase OpenEx では有効にならないですね。

コントロールパネルの設定と違うところといえば、

コントロールパネルでは

  Extended Ansi SQL = 0 というのがあります。

これは dsn ファイルにはありませんね。
逆に、 dsn ファイルには

  UserCommitSync = Yes

  DraverId = 25

  DBQ = mdbのフルパス

という設定があります。それ以外は全く同じですね。

他にはどうやって調べればよいのでしょうか?

Takeshi 2002/04/30(火) 16:17:29
  毎度、お世話になっております。

ファイル DSNがおかしいと思い、コントロールパネルから新規に作成しました。
該当する Accessのファイル(*.mdb)を選択して[OK]すると、

  一般エラー:DSNファイル 'F:\ 〜(DSNファイルのフルパス) ' が無効です。

というエラーが出ます。これが原因なんでしょうか?
だとすれば対処はできるんでしょうか?

sugar 2002/04/30(火) 16:43:55
> 一般エラー:DSNファイル 'F:\ 〜(DSNファイルのフルパス) ' が無効です。
>
何なんでしょうね、Fドライブは、何か特別なドライブなのでしょうか?

それはそうと、プログラムから"DBQ="でmdbファイル名を指定するなら、
ファイルDSNの作成時にmdbを指定しなくても良いのではないでしょうか。

Takeshi 2002/04/30(火) 16:53:57
  お世話になっております。

F:ドライブはネットワークドライブです。

VC++の(dswファイル)も
Accessの(mdbファイル)も
データソースの(dsnファイル)も
ネットワークドライブ上にあります。

もちろん、VC++はローカルから起動していますが。
システム上何か問題がありますでしょうか?

DBQ でファイルを直接指定していたのは、ある方からアドバイスを頂いて
やってみただけです。今は DBQ は指定していません。

しかし、ファイルDSN を作成する時点で何かおかしいという事は、
VC++以前にシステムの問題なんですか?

不良PG [E-Mail] 2002/05/09(木) 14:05:17
・・・
なぜ、解答が得られないのか判りませんか?

>DBQ でファイルを直接指定していたのは、ある方からアドバイスを頂いて
>やってみただけです。今は DBQ は指定していません。

とおっしゃっていますが、このスレをたてた時に貴方は、どのように書きましたか?
読み直してみましょう・・

Takeshi 2002/05/09(木) 14:54:21
  お世話になってます。


う 〜 ん、つまりプログラムではなく、システム上の問題だから ですか?

ファイルそのものは正常。しかし、VC++が見に行ってくれない。
という事は、指定の方法とか、コントロールパネル等の設定ですか?

何故つかないのかはっきりとは分かりません。理由を教えて下さい。

不良PG [E-Mail] 2002/05/09(木) 15:25:01
貴方の問題です

始めは、
>MyDatabase_DB.Open
>(NULL,FALSE,TRUE,"ODBC;DSN=MS AccessDatabase;DSQ=my.mdb",FALSE);
このようなことをやっていたのに、

途中で
>My_DB.OpenEx
>("DSN=MS Access Database;DBQ=F:\VC++\My.mdb",CDatabase::openReadOnly);
こうなって

最後には、

>DBQ でファイルを直接指定していたのは、ある方からアドバイスを頂いて
>やってみただけです。今は DBQ は指定していません。
こうなっています

さらに

>F:ドライブはネットワークドライブです。
>
>VC++の(dswファイル)も
>Accessの(mdbファイル)も
>データソースの(dsnファイル)も
>ネットワークドライブ上にあります。

この情報も後からですか・・

このように条件がころころ変わっている(情報が足りていない?)状態では、
解答数が増え判りづらくなり解答をする気も起きなくなります。

サポートセンターと勘違いしていませんか?

Takeshi 2002/05/09(木) 15:37:40
[[解決]]
  どうもすいませんでした。

問題解決ではありませんが、このスレッドは終了した方がいいですね。

後は自力で何とかします。

不良PG [E-Mail] 2002/05/09(木) 15:55:09
>このように条件がころころ変わっている(情報が足りていない?)状態では、
>解答数が増え判りづらくなり解答をする気も起きなくなります。
>
>サポートセンターと勘違いしていませんか?

ちょっと書きすぎました m(_ _)m

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