ACCESS 2007で保存したMBDが開けない

解決


じん  2010-11-05 16:12:28  No: 102660  IP: [192.*.*.*]

環境:WindowsXP
      ACCESS2007
      VB6

Access???で作成したmdbファイルをVbでADODB.Openすると問題ないのですが、ACCESS2007で保存したmdbファイルをOpenするとOpenできなくてエラーになってしまいます。
※ACCESS2007では[拡張子:.mdb]として保存しました。
最初のmdbファイルに戻すとまた通常通りOpenできます。
なので、パスは合っているのですが、ほかに何か見なければいけないところありますでしょうか?
よろしくお願いします。

編集 削除
魔界の仮面弁士  2010-11-05 17:43:54  No: 102661  IP: [192.*.*.*]

> ※ACCESS2007では[拡張子:.mdb]として保存しました。
名前を付けて保存する際に、
  ・Access 2000 形式
  ・Access 2002-2003 形式
  ・Access 2007 形式
のいずれを選択していますか?


> Openできなくてエラーになってしまいます。
どのプロバイダーを使用していますか?
  ・Microsoft.ACE.OLEDB.12.0
  ・Microsoft.JET.OLEDB.4.0
  ・Microsoft.JET.OLEDB.3.51
  ・上記以外


> ほかに何か見なければいけないところありますでしょうか?
Microsoft.ACE.OLEDB.12.0 で接続したうえで、ADODB.Connection の
Properties("Jet OLEDB:Engine Type").Value の戻り値を確認すると、
何が返されますか? mdb 形式なら 5 以下、accdb 形式なら 6 のはずです。

編集 削除
じん  2010-11-08 09:19:42  No: 102662  IP: [192.*.*.*]

魔界の仮面弁士さん回答ありがとうございます。

Accessは「Access 2002-2003 形式」で保存しています。
プロバイダーは「Microsoft.JET.OLEDB.3.51」を使用しています。

すいません
> Microsoft.ACE.OLEDB.12.0 で接続したうえで、
とありますが、どのような設定で確認すればよいのでしょうか。
とりあえず、今のコードにADODB.Connection のProperties("Jet OLEDB:Engine Type").Value をやってもエラーになってしまいます。

勉強不足で申し訳ありませんが、よろしくお願いします。

編集 削除
じん  2010-11-08 10:08:24  No: 102663  IP: [192.*.*.*]

続けて投稿すいません。

どうやら、私が操作しようとしているmdbファイル自体は97形式の古いものだったので、本来は「Access 2002-2003 形式」で保存するのではなく、97形式で保存するべきでした。
ですが、ACCEESS2007で97形式の保存はできないのですね。

すいません、何か進展があったというわけではありませんが、よろしくお願いします。

編集 削除
魔界の仮面弁士  2010-11-08 22:11:36  No: 102664  IP: [192.*.*.*]

>> Microsoft.ACE.OLEDB.12.0 で接続したうえで、
> とありますが、どのような設定で確認すればよいのでしょうか。
Connection に指定する Provider を変更するだけです。

細かい違いはありますが、基本的には
  Microsoft.JET.OLEDB.3.51
  Microsoft.JET.OLEDB.4.0
  Microsoft.ACE.OLEDB.12.0
のそれぞれのプロバイダで同じように使えるはずです。
なお、Microsoft.ACE.OLEDB.12.0 は Access 2007 や 2010 を
インストールしてある環境で使用可能です。

Office 2007 が無い場合には下記を使う事もできますが、
今回は 2007 をお持ちでしたよね。
http://www.microsoft.com/downloads/details.aspx?FamilyID=7554f536-8c28-4598-9b72-ef94e038c891&displayLang=ja


> Accessは「Access 2002-2003 形式」で保存しています。
せめて 2000 形式にしておいた方が良いでしょう。また、変換する際には
mdb の ANSI SQL モードを 92 から 89 に変更しておいてください。


> プロバイダーは「Microsoft.JET.OLEDB.3.51」を使用しています。
Jet 3.5x は、2000 以降の形式に対応していません。
可能であれば、Jet 4.0 への置き換えを検討してみてください。

Microsoft.JET.OLEDB.3.51 は mdb の最適化機能も有していませんし、
今となっては、あまりお勧めできるものではありません。

《ADO の場合》
  Microsoft.JET.OLEDB.3.51 :2002 形式には非対応
  Microsoft.JET.OLEDB.4.0  :2002 形式にも対応
  Microsoft.ACE.OLEDB.12.0 :2002 形式にも対応

《DAO の場合》
  CreateObject("DAO.DBEngine.35")  :2002 形式には非対応
  CreateObject("DAO.DBEngine.36")  :2002 形式にも対応
  CreateObject("DAO.DBEngine.120") :2002 形式にも対応


> ACCEESS2007で97形式の保存はできないのですね。
Access 97 への変換機能を有するのは、2003 までですね。
http://www.accessclub.jp/actips/tips_19.htm

ある程度安定して変換できるのは、
Access 2007 で「Access 2000 形式」で保存してから、
Access 2000 で「Access 97 形式」に保存する事でしょうか。


なお、プログラムで 97 形式へのバージョンダウン変換を行う場合には、
下記のように記述する事ができます。
ただし、「上位バージョンでしか使えない機能」を含んだ mdb だと、
正常に変換することができないため、バージョンアップの変換に比べると
うまくいかないことも多いですけれども。

CreateObject("JRO.JetEngine").CompactDatabase _
      "Provider=Microsoft.Jet.OLEDB.4.0;" _
    & "Data Source=C:\db1_2000.mdb;" _
    & "Jet OLEDB:Engine Type=5;" _
    & "Locale Identifier=0x411;" _
    , "Provider=Microsoft.Jet.OLEDB.4.0;" _
    & "Data Source=C:\db1_97.mdb;" _
    & "Jet OLEDB:Engine Type=4;" _
    & "Locale Identifier=0x411;"

編集 削除
じん  2010-11-09 09:09:04  No: 102665  IP: [192.*.*.*]

魔界の仮面弁士さん
丁寧にありがとうございます。

自分でも色々やってみてはいるのですが、Jet 4.0を使用して、エラーがでることはなくなりました。
エラー自体は3.51が原因だったみたいです。
形式は現在は2000形式で保存しています。

現状、どのみち97形式のままできないのであれば、2000形式ではなく2007形式にしようと考えています。この場合、拡張子の指定を変えるのはもちろんですが(mbd→accdb)  Jet 4.0で問題ないのでしょうか?

それとも同じようなことで下記を確認すると
http://madia.world.coocan.jp/cgi-bin/VBBBS/wwwlng.cgi?print+200809/08090018.txt

Microsoft.ACE.OLEDB.12.0を使用しないといけない?のでしょうか?
また、Microsoft.ACE.OLEDB.12.0を使用する場合は、Accees2007がインストールされていないと使用できませんよね?

現在mdbファイルを読み込む実行ファイルがある各パソコンにはすべてAccees2007が入っていません。
なにか(DLLなど)のファイルのみをコピーすればよいのか、それともすべてにAccees2007をインストールする必要があるのか、わかりません。

また、今回の修正では2000形式(Jet 4.0)に変更して、
以前の97形式(Jet3.51)と変わりない動作ができているようです。
この2000形式に対応したものは
> Connection に指定する Provider を変更するだけです。
でJet4.0に変更しただけですがそもそもそれだけで問題ないのか、疑問です。
2007形式(ACE.OLEDB.12.0)の場合も同じようにできるのでしょうか?

長くなってすいません、よろしくお願いします。

編集 削除
じん  2010-11-09 14:58:41  No: 102666  IP: [192.*.*.*]

続けて投稿すいません。

とりあえず、2007形式でエラーをださずにできたのでやったことを記載します。

・Access2007がインストールされていないPCに下記インストール
http://www.microsoft.com/downloads/details.aspx?FamilyID=7554f536-8c28-4598-9b72-ef94e038c891&displayLang=ja

・プロジェクト参照設定を変更
  Microsoft DAO 3.6  →  Microsot Office 12.0 Access database…

・コード内Provider変更
  Microsoft.JET.OLEDB.4.0   →  Microsoft.ACE.OLEDB.12.0

・各コード内の拡張子変更(.mdb→.accdb)

これで、DBの値も取得でき、OpenやCompactDatabaseなどで発生していたエラーはなくなりました。

魔界の仮面弁士さんが言っている
> mdb の ANSI SQL モードを 92 から 89 に変更しておいてください。
はMdbファイルが対象で今回の2007形式(accdbファイル)では考慮しなくても問題ないでしょうか?
ほかに何か注意すること等ありますでしょうか?

よろしくお願いします。

編集 削除
魔界の仮面弁士  2010-11-09 21:52:10  No: 102667  IP: [192.*.*.*]

> (mbd→accdb)  Jet 4.0で問題ないのでしょうか?
《ADO の場合》
  Microsoft.JET.OLEDB.4.0 :2007 形式に非対応
  Microsoft.ACE.OLEDB.12.0:2007 形式に対応

《DAO の場合》
  CreateObject("DAO.DBEngine.36")  :2007 形式に非対応
  CreateObject("DAO.DBEngine.120") :2007 形式に対応


> Accees2007がインストールされていないと使用できませんよね?
前回の回答で、
>> Office 2007 が無い場合には下記を使う事もできますが、
と書いた通りです。


> ・プロジェクト参照設定を変更
>   Microsoft DAO 3.6  →  Microsot Office 12.0 Access database…
ですます。なお、参照設定なしでレイトバインド動作させる場合、
前者が CreateObject("DAO.DBEngine.36") で、
後者が CreateObject("DAO.DBEngine.120") です。


> ・コード内Provider変更
>   Microsoft.JET.OLEDB.4.0   →  Microsoft.ACE.OLEDB.12.0
DAO と ADO を併用しているのですね?


> ・各コード内の拡張子変更(.mdb→.accdb)
後からエクスプローラー等で拡張子を変更しても、DB の読み書きに支障は無いので
拡張子そのものは、データベースの振る舞いとは直接関係ないと思います。

ただし、Access 2007 での新規作成時においては、指定するファイル名を
accdb 拡張子にすると Standard ACE DB(2007 形式)になり、
mdb にした場合は、Standard Jet DB(2000形式 または 2002-2003 形式)です。
mdb のバージョンは、Access のオプション[基本設定]-[データベースの作成]の
[既定のファイル形式]の影響を受けます。


> OpenやCompactDatabaseなどで発生していたエラーはなくなりました。
あとは、こういう違いがありますね。
http://support.microsoft.com/kb/224192


>> mdb の ANSI SQL モードを 92 から 89 に変更しておいてください。
これは、Access のオプション[オブジェクト デザイナ]-[クエリ デザイン]の
[SQL サーバー互換構文 (ANSI 92)]の欄で設定します。


> Mdbファイルが対象で今回の2007形式(accdbファイル)では考慮しなくても問題ないでしょうか?
はい、通常は ANSI 92 を選択してください。
意図的に ANSI 89 が使われるのは、Access 97 互換で処理する場合だけです。

編集 削除
じん  2010-11-10 08:45:05  No: 102668  IP: [192.*.*.*]

魔界の仮面弁士さん

ありがとうございます。
まだまだ勉強不足ですが、かなり初歩的な状態から少し理解ができた気がします。
また何かありましたら、お願いします。

編集 削除
じん  2010-11-10 09:49:58  No: 102669  IP: [192.*.*.*]

すいません、解決にしてしまいましたが、質問させてください。
> DAO と ADO を併用しているのですね?
とありますが、それはどういった点からそういえるのか教えてください。

ADODB.Connection.open     →  これはADO
DBEngine.CompactDatabase  →  これはDAO
というところからでしょうか?

また併用している場合、ADOは参照設定にMicrosot Office 12.0 Access database…を設定してProviderにMicrosoft.ACE.OLEDB.12.0
とする。

DAOはどういった設定,参照?

全然見当違いのことを言っていたら、申し訳ありません。

よろしくお願いします。

編集 削除
じん  2010-11-10 10:05:49  No: 102670  IP: [192.*.*.*]

たびたびすいません。

追加投稿がありますし、解決済みなので新規でリンクをはって質問させてもらいます。

編集 削除