環境:WindowsXP
ACCESS2007
VB6
Access???で作成したmdbファイルをVbでADODB.Openすると問題ないのですが、ACCESS2007で保存したmdbファイルをOpenするとOpenできなくてエラーになってしまいます。
※ACCESS2007では[拡張子:.mdb]として保存しました。
最初のmdbファイルに戻すとまた通常通りOpenできます。
なので、パスは合っているのですが、ほかに何か見なければいけないところありますでしょうか?
よろしくお願いします。
> ※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 のはずです。
魔界の仮面弁士さん回答ありがとうございます。
Accessは「Access 2002-2003 形式」で保存しています。
プロバイダーは「Microsoft.JET.OLEDB.3.51」を使用しています。
すいません
> Microsoft.ACE.OLEDB.12.0 で接続したうえで、
とありますが、どのような設定で確認すればよいのでしょうか。
とりあえず、今のコードにADODB.Connection のProperties("Jet OLEDB:Engine Type").Value をやってもエラーになってしまいます。
勉強不足で申し訳ありませんが、よろしくお願いします。
続けて投稿すいません。
どうやら、私が操作しようとしているmdbファイル自体は97形式の古いものだったので、本来は「Access 2002-2003 形式」で保存するのではなく、97形式で保存するべきでした。
ですが、ACCEESS2007で97形式の保存はできないのですね。
すいません、何か進展があったというわけではありませんが、よろしくお願いします。
>> 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;"
魔界の仮面弁士さん
丁寧にありがとうございます。
自分でも色々やってみてはいるのですが、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)の場合も同じようにできるのでしょうか?
長くなってすいません、よろしくお願いします。
続けて投稿すいません。
とりあえず、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ファイル)では考慮しなくても問題ないでしょうか?
ほかに何か注意すること等ありますでしょうか?
よろしくお願いします。
> (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 互換で処理する場合だけです。
魔界の仮面弁士さん
ありがとうございます。
まだまだ勉強不足ですが、かなり初歩的な状態から少し理解ができた気がします。
また何かありましたら、お願いします。
すいません、解決にしてしまいましたが、質問させてください。
> DAO と ADO を併用しているのですね?
とありますが、それはどういった点からそういえるのか教えてください。
ADODB.Connection.open → これはADO
DBEngine.CompactDatabase → これはDAO
というところからでしょうか?
また併用している場合、ADOは参照設定にMicrosot Office 12.0 Access database…を設定してProviderにMicrosoft.ACE.OLEDB.12.0
とする。
DAOはどういった設定,参照?
全然見当違いのことを言っていたら、申し訳ありません。
よろしくお願いします。
たびたびすいません。
追加投稿がありますし、解決済みなので新規でリンクをはって質問させてもらいます。