5 VBAプログラムのDAOからADOへの変更

本題材の従来のAccessデータベースファイル(.accdb)におけるVBAのプログラムでは、Access固有のデータベースエンジンであるJetデータベースエンジンを介してテーブル等にアクセスしています。accdbでは、Jetデータベースエンジン用のライブラリである「DAO」も、また「ADO」も利用することができます。

しかしADP(.adp)では、外部のSQL Serverがデータベースエンジンとなりますので、「DAO」は使えません。もし元のデータベースファイルのVBAのプログラムにおいて、DAOを使ったコードを書いている場合にはすべてそれをADOのコードに書き換える必要があります。

そこでここでは、モジュールのVBAのプログラムにおいて、DAOからADOへの変更を行います。


まずその最初のステップとして、VBAの「参照設定」を変更します。

アップサイジングウィザードを利用してADPを作った場合、自動的にADOへの参照設定が追加されています。しかし一方でDAOへの参照設定が解除されているわけではありません。DAOにも参照設定されているため、コンパイルエラーにはなりませんが、必ず実行時エラーとなります。したがって、次のような手順で、コーディングの前にまずはその参照設定を変更します。

  1. VBEを開きます(Alt+F11キーなどの操作で)。

  2. メニューより[ツール]-[参照設定]を選択します。

  3. 「参照設定」ダイアログが表示されたら、「参照可能なライブラリファイル」の一覧より、チェックマークが付いているDAOへの参照を探します。Access2007の場合には、「Microsoft Office 12.0 Access database engine Object Library」という項目になっています。

  4. その項目のチェックマークを外して、参照設定を解除します。
    • このとき、「ADO(Microsoft ActiveX Data Objects *.* Library)」の「*.*」の部分のバージョンが古いものになっていますので、最新のものに変更しておくとよいでしょう。
    • ADPのファイル形式のバージョンは「2002-2003」になっています。これは.accdbのファイルをAccess2007でアップサイジングしても同様で、そのままAccess2002や2003で動作可能なことを意味しています。インストールされているAccessのバージョンによってADOの最新バージョンが異なりますので、複数のパソコンで利用する場合には逆にその中のもっとも古いバージョンに合わせるようにしないとエラーとなります。なおエラーとなった場合は、上図参照設定の画面でADOのライブラリ名の前に「参照不可」と表示されますので、その都度そのパソコンに合わせて参照設定先を変更することで対処できます。

  5. 最後に[OK]ボタンをクリックして、設定を確定します。

この状態で[デバッグ]メニューよりコンパイルを実行してみましょう。DAOへの参照設定が解除されていますので、DAOの書き方である「Dim ○○ As Database」といった部分でコンパイルエラーが発生するはずです。次のステップでは、これらをADOのものに書き換えていくことになります。

書き換えとは言っても、隅から隅まで手作業で書き換える必要はありません。DAOとADOはかなり似た部分がありますので、コードに対して一定のルールで一括置換を実行すれば、大半のコンパイルエラーは解消できます。ここでは、まずそのような一括置換を実行し、残りのコンパイルエラーを潰していくという手順でDAOからADOへの変更を行っていきたいと思います。


まず、次の簡易変換表に基づいて、特定のモジュールではなくデータベース内のすべてのモジュールを対象に、つまり「置換」ダイアログで「カレントプロジェクト」を選択して、[すべて置換]を実行します。

なお、コードの書き方は人によってまちまちだと思います。下表の左右でどこが違うかに着目したうえで、DAOの書き方、ADOの書き方、あるいはオブジェクト変数名の付け方などは適宜自分のやり方に合わせてください。

【DAO→ADOの簡易変換表】
DAO ADO
Dim dbs As Database Dim cnn As New ADODB.Connection
Set dbs = CurrentDb Set cnn = CurrentProject.Connection
dbs.Execute cnn.Execute
dbs.Close cnn.Close: Set cnn = Nothing
CurrentDb.Name CurrentProject.Path & "\" & CurrentProject.Name
  • CurrentDb.Nameはそのデータベースファイルのフルパスを返すが、CurrentProject.Nameはファイル名+拡張子のみを返すことに注意
Dim rst As Recordset Dim rst As New ADODB.Recordset
Set rst = dbs.OpenRecordset("テーブル名") rst.Open “テーブル名”, cnn, 引数3, 引数4, 引数5
  • テーブル名の部分がクエリ名でもSQL文の場合も同様
  • 引数3〜5は次表を参照し、ケースに応じて設定します
Dim qdf As QueryDef Dim cmd As New ADODB.Command
BeginTrans cnn.BeginTrans
CommitTrans cnn.CommitTrans
Rollback cnn.Rollback
  • 今回のアップサイジングにおいて必要な項目のみを簡易的に記述しています。元のデータベースのプログラムによってはもっと他にも変更が必要です。

【ADOにおけるRecordsetのOpenメソッドの引数】
引数 設定値 内容
引数3
CursorType
adOpenDynamic
(動的カーソル)
ネットワークでレコードソースを共有している場合、他のユーザーによる追加、変更、および削除が反映されます。
Recordset内でのすべての種類の移動が可能です。

adOpenForwardOnly
(前方スクロール)
先頭レコードから最終レコードに向けての前方向のレコード移動のみ可能です。
Recordsetの内容は静的なもので、他のユーザーによる追加、変更、または削除は表示されません。
レコード内容を編集する必要がなく、単純に前から後ろに向けて1回だけ各レコードにアクセスすればよい場合には、速い処理が可能です。
  • 引数省略時にはこの値が使われます。
adOpenKeyset
(キーセットカーソル)
ネットワークでレコードソースを共有している場合、他のユーザーが更新したレコードを参照することはできますが、他のユーザーが追加したレコードおよび削除したレコードにはアクセスできません。
動的カーソルと同様にRecordset内でのすべての種類の移動が可能です。

adOpenStatic
(静的カーソル)
Recordsetを開いた時点の静的なデータを取得します。そのため、他のユーザーによって行われた追加、変更、削除などの編集結果は表示されません。
Recordset内でのすべての種類の移動が可能です。

引数4
LockType
adLockOptimistic
(共有的ロック)
レコード単位で共有的ロックを行います。
Updateメソッドでレコードを更新する時点でそのレコードがロックされます。
“共有的”ロックのため、他のユーザーも同じレコードを読み込んだり編集したりすることができます。

adLockPessimistic
(排他的ロック)
レコード単位の排他的ロックを示します。
レコードを確実に編集するため、編集処理が開始された時点でそのレコードがロックされます。
“排他的”ロックのため、Updateメソッドでの編集処理が完了するまで、他のユーザーは同じレコードを読み込んだり編集したりすることができません。

adLockReadOnly
(読み取り専用)
読み取り専用で開きます。レコード内容の編集はできません。
  • 引数省略時にはこの値が使われます。
引数5
Option
adCmdText 上表の第一引数の“テーブル名”の部分を「SQL文(SELECT〜〜〜)」として評価します。

adCmdTable 上表の第一引数の“テーブル名”の部分を「テーブル名」として評価します。

adCmdStoredProc 上表の第一引数の“テーブル名”の部分を「ストアドプロシージャ名」として評価します。

adCmdTableDirect 上表の第一引数の“テーブル名”の部分を、「すべての列が返されたテーブル名」として評価します。

  • この表に書かれた設定値がすべてではありません。詳細はAccess VBAのADOに関するヘルプで確認してください。

今回のアップサイジングのケースでは、元のデータベースの、プログラムの作りの関係で、他の個所でも“コンパイルエラー”が発生しています。その個所と変更内容を下記に示します。
エラー個所 変更内容
アクションクエリをQueryDefオブジェクトで定義して実行している

Dim qdf As QueryDef
〜〜〜〜〜〜〜〜
Set qdf = dbs.QueryDefs("qdel検索非該当者")
qdf.Execute
アクションクエリはストアドプロシージャに置き換えているので、その呼び出し方法に書き換える

Dim cmd As New ADODB.Command
〜〜〜〜〜〜〜〜
With cmd
  Set .ActiveConnection = cnn
  .CommandType = adCmdStoredProc
  .CommandText = "qdel検索非該当"
  .Execute
End With

パラメータ付きのアクションクエリをQueryDefオブジェクトで定義して実行している

Dim qdf As QueryDef
〜〜〜〜〜〜〜〜
Set qdf = dbs.QueryDefs("qapp業務履歴")
With qdf
  .Parameters("追加ID") = [ID]
  .Execute
End With
アクションクエリはストアドプロシージャに置き換えているので、その呼び出し方法に書き換える

Dim cmd As New ADODB.Command
〜〜〜〜〜〜〜〜
With cmd
  Set .ActiveConnection = cnn
  .CommandType = adCmdStoredProc
  .CommandText = "qapp業務履歴"
  .Parameters.Refresh
  .Parameters("@追加ID") = [ID]
  .Execute
End With



また今回のプログラムでは、コードによってSQL文を組み立て、それを元にRecordsetを開くという処理や、いわゆるアクションクエリの処理を行うところがあります。その際、AccessとSQL Serverとで明らかに異なるSQLの記法があります。“実行時エラー”となるはずですので、この時点でVBEの検索や置換の機能を利用して変更を加えておくことにします。

今回の場合、その変更点は次のようなものです。
Access SQL Server
(Like演算子のワイルドカード)
Like “*あいうえお*”
「*」を「%」に変更します
Like “%あいうえお%”

(日付の引用符)
#2010/12/31#
「#」を「’」(シングルクォーテーション)に変更します
‘2010/12/31’

(文字列の引用符)
“あいうえお”
「”」で囲んでいる場合は「’」(シングルクォーテーション)に変更します
‘あいうえお’
  • Accessでは「”」でも「’」でも動作しますが、SQL Serverでは「’」に統一します。
  • 文字列変数として「strWhere = "氏名=“”須永 章子”””」のように組み立てている場合には、「strWhere = "氏名=‘須永 章子’」のように書き換えます。
(Where条件におけるTrue/False)
性別 = True
性別 = False
「1(または-1)」か「0」に変更します
性別 = CONVERT(bit, 1)
性別 = CONVERT(bit, 0)

(SQL文中における組み込み関数)
Date()
SQL Serverの関数に変更します
GetDate()
  • AccessとSQL Serverで異なるものはこれ以外も同様に変更します。
(組み込み関数の引数)
DateAdd(‘yyyy’,〜〜〜〜〜)
「”」(ダブルクォーテーション)に変更します
DateAdd(“yyyy”,〜〜〜〜〜)
  • Accessでは「’」でも「”」でも動作しますが、SQL Serverでは「”」に統一します。
  • 文字列変数として組み立てている場合には「strWhere = "DateAdd(""yyyy"", 〜〜〜)〜〜〜”」のように書くよう注意します。
(削除クエリの構文)
DELETE * FROM tbl人材
DELETEの次の「*」を抹消します
DELETE FROM tbl人材


ここでは、参照設定先をDAOからADOへと切り替えた場合に、“とりあえずコンパイルエラーをなくす”というところまでやってみました。メソッドの引数など、ADOの書き方によっては実行時エラーが発生するかもしれませんが、その部分については実際にアプリケーションを動かしながらデバッグしていきたいと思います。
| Index | Prev | Next |

 

Copyright © T'sWare All rights reserved