DAO
DAOを使う
DAO(Data Access Object)はAccess97やVB4で使用されていたオブジェクトモデルです。現在はADOに変わってしまい、使用する機会はあまりないかもしれません。
DAOを使用するにはVisual Basic Editorから[ツール]→[参照設定]で選択します。Access97は DAO3.51 Access2000は DAO3.6を使います。DAOを使うには以下のような構文になります。標準モジュール内などに記述します。
Sub SetDB() Dim ws As Workspace Dim db As DAO.Database Dim rs As DAO.Recordset Set ws = DBEngine.Workspaces(0) 'Jet データベースに接続 Set db = ws.OpenDatabase("c:\acdb\sample.mdb") 'c:\acdb\sample.mdbを開く 'カレントDBの場合は Set db = CurrentDb Set rs = db.OpenRecordset("tbl_Sample") 'tbl_Sampleテーブルを開く rs.Close '接続を閉じる db.Close ws.Close End SubOpenRecordsetの構文は以下の記述から成り立っています。
Set rs = db.OpenRecordset(Source,Type,Option,Lock) Type,Option,Lockは省略可能
Type dbOpenTable テーブルタイプのオブジェクトを開く dbOpenDynamic 動的タイプのオブジェクトを開く dbOpenDynaset ダイナセットタイプのオブジェクトを開く dbOpenSnapshot スナップショットタイプのオブジェクトを開く dbOpenForwardOnly 前方スクロールタイプのオブジェクトを開く Option dbAppendOnly データの追加のみ dbReadOnly 読み取り専用 Lock dbReadOnly 読み取り専用 dbPessimistic 排他ロックする
レコードの移動
フォームであればコマンドボタンウィザードによって (DoCmd.GoToRecord , , acFirst)などと簡単に移動できますが、レコードセット内で移動するには Move を使います。
Sub Move() Dim ws As Workspace Dim db As DAO.Database Dim rs As DAO.Recordset Set ws = DBEngine.Workspaces(0) 'Jet データベースに接続 Set db = ws.OpenDatabase("c:\acdb\sample.mdb") 'c:\acdb\sample.mdbを開く 'カレントDBの場合は Set db = CurrentDb Set rs = db.OpenRecordset("tbl_Sample") 'tbl_Sampleテーブルを開く rs.MoveLast '最後のレコードへ移動 MsgBox rs!Fields(0)&"です" rs.Close '接続を閉じる db.Close ws.Close End SubMoveNext・・・・・・・・・・次のレコードへ移動
MovePrevious・・・・・・・一つ前のレコードへ移動
MoveFirst・・・・・・・・・・先頭ののレコードへ移動
MoveLast・・・・・・・・・・最後ののレコードへ移動
Move n ・・・・・・・・・・・ n=数字 指定数ののレコードへ移動
レコードの修正・追加・削除
レコードを修正するには edit 後、 Update を行います。
Public Function 部署CD修正(BushoID As Long,ShozokuID As Long) ' 社員テーブル内の指定した部署コードを FindFirstで検索して所属コードを修正する。 Dim db As Database Dim rs As Recordset Set db = CurrentDb Set rs = db.OpenRecordset("社員",dbopendynaset) rs.FindFirst "部署コード=" & BushoID If rs.NoMatch = False Then rs.Edit rs!所属コード = ShozokuID rs.Update End If rs.Close End Function上記の例では、引数BushoIDとShozokuIDで指定したデータによってデータを更新します。
レコードを追加するには AddNew 後、 Update を行います。
Public Function 社員追加(BushoID As Long,ShozokuID As Long,Name As String) Dim db As Database Dim rs As Recordset Set db = CurrentDb Set rs = db.OpenRecordset("社員") rs.AddNew rs!部署コード = BushoID rs!所属コード = ShozokuID rs!氏名 = Name rs.Update End If rs.Close End Functionレコードを削除するには Delete 後、 Update を行います。
Public Function 社員削除(ShainID As Long) ' 社員テーブル内の指定した社員コードを FindFirstで検索してデータを削除する。 Dim db As Database Dim rs As Recordset Set db = CurrentDb Set rs = db.OpenRecordset("社員",dbopendynaset) rs.FindFirst "社員コード=" & ShainID If rs.NoMatch = False Then rs.Delete rs.Update End If rs.Close End Function
テーブル名を取得する
CurrentDb内のテーブルオブジェクト名を取得するには TableDef を利用します。
以下の例ではフォーム読み込み時に属性がシステムオブジェクトであるテーブル以外のオブジェクト名を取得して
コンボボックス「CmbTlist」に表示します。
Private Sub Form_Load() Dim myDB As DAO.Database Dim myTD As DAO.TableDef Set myDB = CurrentDb For Each myTD In myDB.TableDefs If (myTD.Attributes And dbSystemObject) = 0 Then Source = Source & myTD.Name & ";" End If Next Me!CmbTlist.RowSource = Source End Sub ************************************************************** ’CmbTlistで選択したテーブルのデータをSQLで削除する。 Private Sub Cmd1_Click() Dim wTB As String wTB = Forms![Form1]![CmbTlist] DoCmd.RunSQL "DELETE * FROM " & wTB End Sub
テーブルの作成
DAOによってテーブルを作成するには CreateTableDef メソッドを利用します。
Private Sub Mktbl_Click() Dim db As Database Dim tbl As TableDef Set db = CurrentDb Set tbl = db.CreateTableDef("tbl1") 'フィールドの作成 With tbl .Fields.Append .CreateField("ID", dbLong, 5) ’長整数型 .Fields.Append .CreateField("名前", dbText, 20) ’テキスト型 .Fields.Append .CreateField("入力日", dbDate) ’日付型 .Fields.Append .CreateField("金額", dbCurrency, 8) ’通過型 ’IDフィールドをオートナンバー型にする .Fields("ID").Attributes = dbAutoIncrField End With 'テーブルの作成 db.TableDefs.Append tbl Set tbl = Nothing End Subフィールド名・データ型・フィールドサイズの順に指定します。オートナンバー型にしたいフィールドは長整数型でなくてはなりません。
DAOでのフィールド型の一覧です。
データ型 キーワード バイト型 dbByte 通貨型 dbCurrency 日付/時刻型 dbDate 時刻型 dbTime 倍精度浮動小数点型 dbDouble 単精度浮動小数点型 dbsingle 浮動小数点型 dbFloat 整数型 dbInteger 長整数型 dbLong メモ型 dbMemo テキスト型 dbText
データベースのコピー・最適化
データベースファイルのコピー・最適化を行うには CompactDatabase を使います。
Private Sub CompDB_Click() Dim oDB As String '元ファイル Dim nDB As String 'バックアップファイル oDB = "D:\db1.mdb" nDB = "D:\db2.mdb" If (nDB) <> "" Then 'バックアップファイルが存在する場合 Kill nDB 'バックアップファイルを削除 End If DBEngine.CompactDatabase oDB,nDB End Sub