Access2000を操作するプログラムをAccess2007にバージョンアップ時にしなければならないことは?

解決


Misaki  2008-09-19 12:02:18  No: 101089  IP: 192.*.*.*

VB6.0からAccess2000のMDBを操作するプログラムがあるのですが、このたびAccessをバージョン2007に変更することになりました。
ADOを使用しています。
2007に変更するにあたって、VBのソースを変更する箇所はたくさんありますか?
Access2007はまだ手元にないのでわかりません。
すんなりバージョンアップできるものなのでしょうか?
VBはこれまでどおり6.0を使用します。
よろしくお願いします。

編集 削除
魔界の仮面弁士  2008-09-19 13:13:17  No: 101090  IP: 192.*.*.*

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 を返す列(複数値フィールド/添付ファイルフィールド)などの
「新機能」を用いるなら、対応したコードを書かねばならないでしょうね。

なお、

編集 削除
Misaki  2008-09-19 14:42:07  No: 101091  IP: 192.*.*.*

魔界の仮面弁士さん、ありがとうございます。
そんなに大変な作業。。。というわけではないんですね。
特にAccess2007の新機能を使う予定ではありません。
ただ、旧バージョンの「*.MDB」はAccess2007では「*.ACCDB」になるんですよね?
旧「*.MDB」のファイルを2007で読み込み、データを修正して「*.MDB」の形式で保存して使用するとしたら、問題なく使えそうですね。。
今、Access2007がなく、試せないので購入してみます。
またわからないことがあれば質問させて頂きます。

編集 削除
Misaki  2008-09-19 14:51:02  No: 101092  IP: 192.*.*.*

↑とりあえず解決ということで・・・。

編集 削除
魔界の仮面弁士  2008-09-19 15:27:09  No: 101093  IP: 192.*.*.*

なお、今回は 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 で開く際に、
初回のみ、システムテーブルの更新作業を求められる場合があります。

編集 削除
Misaki  2008-09-19 16:57:37  No: 101094  IP: 192.*.*.*

魔界の仮面弁士さん、ありがとうございます。
拡張子MDBのまま使おうと思っていたのですが、ACCDBに変更することになりそうです。
ただ、データの構造を変えたり、新機能を使うことはしないようですが。
ということは、全く修正しなくても使える・・・ってことはなさそうですね。

編集 削除
魔界の仮面弁士  2008-09-19 18:51:12  No: 101095  IP: 192.*.*.*

大雑把ですが、注意点をまとめてみました。


《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 にて
  設定されることになります。

編集 削除
Miaski  2008-09-19 19:16:46  No: 101096  IP: 192.*.*.*

魔界の仮面弁士さん、注意点をたくさん書いていただいてありがとうございます。助かります(^^)
Access2007に移行してみて、わからない点があったらまた質問させていただきます。
本当にありがとうございました。

編集 削除
魔界の仮面弁士  2008-09-19 20:38:24  No: 101097  IP: 192.*.*.*

# 解決済みのスレッドを延ばすのも何ですが、もう一つ思い出したので。

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

編集 削除
Misaki  2008-09-21 21:35:45  No: 101098  IP: 192.*.*.*

魔界の仮面弁士さん、たびたび丁寧にありがとうございます。
頑張ってやってみます!!

編集 削除
Sting  2008-10-23 11:50:56  No: 101099  IP: 192.*.*.*

私の場合、Access2003にてVBAを利用したAccessのみで完結している
プログラムをOffice2007利用のPCにて実行できるようにしたいのですが
上記と同様にCompactDatabaseにてエラーが出ます。
データベースはmdbのままでよいのですが、サイズの最適化のため
CompactDatabaseを利用したいのですが
このエラーを回避する方法はどのようにすればよいのでしょうか?

もし分かりましたらご教授いただければと思います。
よろしくお願いします。

編集 削除
魔界の仮面弁士  2008-10-23 12:02:33  No: 101100  IP: 192.*.*.*

解決済みのスレッド、それも他人の立てた質問に便乗するのでは無く、
新たな質問として投稿し、そこにこの URL へのリンクを貼ってください。


> 上記と同様にCompactDatabaseにてエラーが出ます。
なので回避策として、DAO を使うようにと書かれていますよね。

編集 削除
Sting  2008-10-23 13:31:07  No: 101101  IP: 192.*.*.*

記載方法については、申し訳ありませんでした。
回答ありがとうございました。

編集 削除