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 Sub

OpenRecordsetの構文は以下の記述から成り立っています。

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 Sub

MoveNext・・・・・・・・・・次のレコードへ移動
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