VB6.0からAccess2000のMDBを操作するプログラムがあるのですが、このたびAccessをバージョン2007に変更することになりました。
ADOを使用しています。
2007に変更するにあたって、VBのソースを変更する箇所はたくさんありますか?
Access2007はまだ手元にないのでわかりません。
すんなりバージョンアップできるものなのでしょうか?
VBはこれまでどおり6.0を使用します。
よろしくお願いします。
Access 2007 は、Access 2000 形式(Jet 4.0)の mdb を利用できるので、
通常は、特に何もする必要はありません。
ただし、Access 2007 形式の accdb に切り替えるつもりなのであれば、
DAO 3.6 や Microsoft.JET.OLEDB.4.0 ではアクセスできないため、
若干のコード変更が必要になるでしょう。2007 形式を扱うには、
DAO の上位バージョン(ACEDAO.DLL v12.0) や、専用の OLEDB プロバイダ
(Microsoft.ACE.OLEDB.12.0) が要求されます。
とはいえ、従来と使い方が大きく変わる事は無いですが、それでもたとえば
Recordset を返す列(複数値フィールド/添付ファイルフィールド)などの
「新機能」を用いるなら、対応したコードを書かねばならないでしょうね。
なお、
魔界の仮面弁士さん、ありがとうございます。
そんなに大変な作業。。。というわけではないんですね。
特にAccess2007の新機能を使う予定ではありません。
ただ、旧バージョンの「*.MDB」はAccess2007では「*.ACCDB」になるんですよね?
旧「*.MDB」のファイルを2007で読み込み、データを修正して「*.MDB」の形式で保存して使用するとしたら、問題なく使えそうですね。。
今、Access2007がなく、試せないので購入してみます。
またわからないことがあれば質問させて頂きます。
↑とりあえず解決ということで・・・。
編集 削除なお、今回は 2000 形式なので無関係ですが、
Jet 3.0/3.5 形式の mdb (Access 95/97) も、限定的に使用可能です。
ただしこちらは、TEXT フィールドの ANSI/Unicode の違いなどから、
若干の修正が必要になる場合もありますけれども。
> 特にAccess2007の新機能を使う予定ではありません。
ならば何も修正しない、というのも選択肢のひとつです。
先に書いたように、Jet 4.0 形式 の mdb (Access 2000/2002/2003) は、
Access 2007 でそのまま読み書きできますので。
> ただ、旧バージョンの「*.MDB」はAccess2007では「*.ACCDB」になるんですよね?
既定の形式は accdb ですが、旧バージョンのファイルについては、
意図的に変更しない限り、accdb に変更される事はありません。
Access 2007 で mdb や adp を使い続ける事もできます。
なお、Access で生成された mdb ではなく、JRO や DAO 等で生成された mdb では、
VBA 等の管理情報が不足している可能性があるため、Access 2007 で開く際に、
初回のみ、システムテーブルの更新作業を求められる場合があります。
魔界の仮面弁士さん、ありがとうございます。
拡張子MDBのまま使おうと思っていたのですが、ACCDBに変更することになりそうです。
ただ、データの構造を変えたり、新機能を使うことはしないようですが。
ということは、全く修正しなくても使える・・・ってことはなさそうですね。
大雑把ですが、注意点をまとめてみました。
《Access の UI を併用する場合》
・データベース ウィンドウが無くなりました。代わりに、ナビゲーション ウィンドウが
採用されています。操作感が異なるので、ユーザー向けにマニュアル等を作成していた場合、
その内容を見直す必要があるかと思います。
・ご存知の通り、Office のツールバー(CommandBar)が、リボンに変更されました。
CommandBar とはバーのサイズが異なるため、Access 側のフォーム等を用いていた場合、
利用可能な画面領域に差が生じるため、画面デザインの見直しが必要になる可能性があります。
・メニュー項目が変更されているため、SendKeys によるメニュー制御は見直しが必要です。
・DoCmd.DoMenuItem メソッドへの変更はありません。従来の acMenuVer70 等のコードは
そのまま利用できます。ただし、2007 のメニューを DoMenuItem で操作する事はできません。
《DAO の場合》
・参照設定するライブラリが、DAO360.DLL から ACEDAO.DLL に変更になります。
・新機能サポートのため、ComplexType/Field2/Recordset2 という型が追加されました。
・ODBCDirect ワークスペースががサポートされなくなりました。この機能を
用いたコードは、RDO 2.0 や ADO を用いたコードに置き換える必要があります。
・Jet ワークスペースからの ODBC 接続や ODBC パススルーは、引き続き利用可能です。
《ADO の場合》
・ADO は、2.5 以上のバージョンを参照してください。
・使用するOLE DB Provider の名前は、"Microsoft.JET.OLEDB.4.0" ではなく、
"Microsoft.ACE.OLEDB.12.0" となります。
・今のところ、ACE12 に対応した JetOLEDBConstants.bas が見当たりませんが、
MDAC 2.5 SDK / Windows DAC 6.0 SDK で定義される定数群は、引き続き
利用可能なようです。(なお、"Jet OLEDB:Engine Type" プロパティは
*.accdb では「6」を返します)
《文書化されていない開発者向け機能について》
・DAO の ISAMStats メソッドや、ADO の"Jet OLEDB:Reset ISAM Stats" プロパティは
引き続きサポートされます。
・ShowPlan の設定箇所が変更になっています。従来、JETSHOWPLAN=ON の設定箇所は
HKLM\SOFTWARE\Microsoft\Jet\4.0\Engines\Debug のレジストリキーでしたが、2007 では
HKLM\SOFTWARE\Microsoft\Office\12.0\Access\Access Connectivity Engine\Debug です。
《その他の変更点》
・外部データのインポート機能として、Microsoft SharePoint がサポートされました。
・エクスポートできる形式が増えています。Excel/Access/Word の 2007 形式はもちろんのこと、
PDF、XPS への出力も可能となっています。SharePoint への発行も可能です。
・エンジン設定の既定値を格納する場所が変更になっています。従来のバージョンでは、
HKLM\SOFTWARE\Microsoft\Jet\4.0\Engines のレジストリキーでしたが、2007 では
HKLM\SOFTWARE\Microsoft\Office\12.0\Access\Access Connectivity Engine にて
設定されることになります。
魔界の仮面弁士さん、注意点をたくさん書いていただいてありがとうございます。助かります(^^)
Access2007に移行してみて、わからない点があったらまた質問させていただきます。
本当にありがとうございました。
# 解決済みのスレッドを延ばすのも何ですが、もう一つ思い出したので。
JRO の CompactDatabase メソッドを用いて、データベース形式を変換する場合、
両引数のプロバイダは、共に Microsoft.ACE.OLEDB.12.0 を用いる必要があります。
(もっともプログラムで変換するより、Access から手作業で変換した方が安全な気もしますが)
たとえば、*.accdb → *.mdb への逆変換はこのようになります。
'Access 2007 形式から Access 2002/2003 形式にバージョンダウン
s = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\db1.accdb"
d = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\db1.mdb;Jet OLEDB:Engine Type=5;Locale Identifier=0x411;"
CreateObject("JRO.JetEngine").CompactDatabase s, d
ただし JRO は、Access 2007 形式(Jet OLEDB:Engine Type=6)での出力を
サポートしていないようです。たとえば下記はエラーとなります。
s = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\db2.mdb"
d = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\db2.accdb;Jet OLEDB:Engine Type=6;Locale Identifier=0x411;"
CreateObject("JRO.JetEngine").CompactDatabase s, d 'エラー発生
プログラムからの変換作業が必要な場合は、DAO を利用してください。
こちらの CompactDatabase メソッドであれば、*.mdb → *.accdb も可能です。
'Access 2003 形式から Access 2007 形式にバージョンアップ
DBEngine.CompactDatabase "C:\db3.mdb", "C:\db3.accdb", dbLangJapanese, dbVersion120
あるいは、Access の Application.CompactRepair メソッドを使って
バージョン変更を行うこともできます。
ConvertAccessProject "C:\db4.mdb","C:\db4.accdb", acFileFormatAccess2007
魔界の仮面弁士さん、たびたび丁寧にありがとうございます。
頑張ってやってみます!!
私の場合、Access2003にてVBAを利用したAccessのみで完結している
プログラムをOffice2007利用のPCにて実行できるようにしたいのですが
上記と同様にCompactDatabaseにてエラーが出ます。
データベースはmdbのままでよいのですが、サイズの最適化のため
CompactDatabaseを利用したいのですが
このエラーを回避する方法はどのようにすればよいのでしょうか?
もし分かりましたらご教授いただければと思います。
よろしくお願いします。
解決済みのスレッド、それも他人の立てた質問に便乗するのでは無く、
新たな質問として投稿し、そこにこの URL へのリンクを貼ってください。
> 上記と同様にCompactDatabaseにてエラーが出ます。
なので回避策として、DAO を使うようにと書かれていますよね。
記載方法については、申し訳ありませんでした。
回答ありがとうございました。