ACCeSS之DAO recordset方法

转载日本某网站。。。。。

Recordsetの作成(DAO編)

01.オブジェクト変数の宣言

【書式】Dim オブジェクト名 As クラス名

 オブジェクト変数を宣言するには,DimStaticPublicPrivateステートメントを使用します。これらのステートメントについては変数の適用範囲を参照してください。クラス名は,オブジェクトを提供するコンポーネントの名前と,オブジェクトのクラス名をドット(.)でつないで指定します。DAOオブジェクトを提供するコンポーネントの名前は「DAO」です。

【サンプルコード】

   Dim DB As DAO.Database  (Databaseオブジェクトを扱う変数(DB)を宣言)
      Dim RS As DAO.Recordset (Recordsetオブジェクトを扱う変数(RS)を宣言)

 

02.データベースに接続する

 データベースに接続するには,Databaseオブジェクトを使用します。

  • カレントデータベースに接続する

CurrentDb関数の戻り値をDatabase型オブジェクト変数に代入します。

【サンプルコード】

   Dim DB As DAO.Database
      Set DB = CurrentDb() 
  • 他のAccessデータベースに接続する

 WorkasaceコレクションのOpenDatabaseメソッドを使用します。

【サンプルコード】

   Dim DB As DAO.Database
      Set DB = DBEngine.Workspaces(0).OpenDatabase("D:\Data\Sample.mdb")

 

03.Recordsetオブジェクトの作成

 DatabaseオブジェクトのOpenRecordsetメソッドを利用してレコードセットを作成します。

【書式】
   Set recordset = database.OpenRecordset (type, options)
 
 recordset: Recordsetオブジェクトを表すオブジェクト変数を指定
 database:開いているDatabaseオブジェクト変数を指定
 source:テーブル名,クエリー名,SQL ステートメントを指定
 type:(省略可能) Recordsetの種類を示す定数を指定
 options:(省略可能) Recordsetの特性を指定する定数の組み合わせを指定

引数typeには次の定数から 1つを使用します。

定数

内容

dbOpenTable

テーブルタイプの Recordsetオブジェクトを作成

dbOpenDynaset

ダイナセットタイプの Recordsetオブジェクトを作成。

dbOpenSnapshot

スナップショットタイプの Recordsetオブジェクトを作成。

dbOpenForwardOnly

前方スクロールタイプの Recordsetオブジェクトを作成。


 種類を指定しないと、テーブルタイプの Recordsetオブジェクトが作成可能な場合は、テーブルタイプの Recordsetオブジェクが作成され、sourceに、リンクテーブルやクエリーを指定している場合はダイナセットタイプの Recordset オブジェクトが作成されます。


引数optionsには,次の定数の組み合わせを使用できます。

定数

内容

dbAppendOnly

レコードの追加はできますが、編集および削除はできません。

dbSeeChanges

編集中のデータを他のユーザーが変更しようとした場合、エラーが発生します。

dbDenyWrite

他のユーザーはレコードの修正や追加できません

dbDenyRead

他のユーザーはテーブルのデータの読み取りはできません。

dbForwardOnly

前方スクロールタイプの Recordsetオブジェクトを作成します。

dbReadOnly

他のユーザーは Recordsetの変更はできません。

dbInconsistent

矛盾を許す更新を可能にします

dbConsistent

一貫性のある更新のみを可能にします。


表中の「」は使用可能なレコードセットのタイプを表しています。
    T・・・テーブルタイプの Recordsetオブジェクト
    D・・・ダイナセットタイプの Recordset オブジェクト
    S・・・スナップショットタイプの Recordsetオブジェクト
    F・・・前方スクロールタイプの Recordsetオブジェクト

  • テーブルタイプのRecordsetオブジェクト

 テーブルタイプのRecordsetオブジェクトは,テーブルに登録されているレコードの集まりを表します。レコードの追加・削除や、データの更新したりすることができます。
1つのローカルテーブルからのみ作成可能で、リンクテーブルや結合による選択クエリで作成することは出来ません。
もとになっているテーブル用に作成された「インデックス」が使用でき、他のタイプのレコードセットに比べ、データのソートや検索が高速です。

【サンプルコード】

    Dim DB As DAO.Database
    Dim RS As DAO.Recordset
    
        Set DB = CurrentDb()
        Set RS = Db.OpenRecordset("生徒名簿",dbopenTable) 
  • ダイナセットタイプのRecordsetオブジェクト

ダイナセットタイプのRecordsetオブジェクトは,ローカルテーブル、リンクテーブル、選択クエリから作成できます。
レコードを追加したり,データを更新したりすることができます。
Recordsetのレコードが変更されると、もとになっているテーブルのレコードも更新され、もとになっているテーブル
 のレコードが更新されると、Recordsetも変更されます。

【サンプルコード】

    Dim DB As DAO.Database
    Dim RS As DAO.Recordset
    
        Set DB = CurrentDb()
        Set RS = Db.OpenRecordset("生徒名簿",dbopenDynaset) 
  • スナップショットタイプのRecordsetオブジェクト

スナップショットタイプのRecordsetオブジェクトは,スナップショット作成時のデータに固定されます。。
レコードセットの内容は更新できません。

【サンプルコード】

    Dim DB As DAO.Database
    Dim RS As DAO.Recordset
    
        Set DB = CurrentDb()
        Set RS = Db.OpenRecordset("生徒名簿",dbopenSnapshot) 
  • 前方スクロールスナップショットタイプのRecordsetオブジェクト

処理は速いが、他のタイプより機能がすくなくなります。
レコードを前方方向のみ移動できます(MoveメソッドとMoveNextメソッドのみ使用可能)。
レコードセットの内容は更新できません。

【サンプルコード】

    Dim DB As DAO.Database
    Dim RS As DAO.Recordset
    
        Set DB = CurrentDb()
        Set RS = Db.OpenRecordset("生徒名簿",dbOpenForwardOnly) 
  • フォームをもとにRecordsetオブジェクトを作成する
【書式】Set recordset = form.Recordset.Clone
 
 recordset:開くRecordsetオブジェクトを表すオブジェクト変数を指定
 form:開いているフォーム

 フォームのRecordsetプロパティは,フォームのRecordsetCloneメソッドを利用すると,AccessのフォームをもとにしてダイナセットタイプのRecordsetオブジェクトを作成することができます。

【サンプルコード】

  Public Sub exsample()
     Dim RS As dao.Recordset
  
     Set RS = Form!F_銀行コード.Recordset.Clone
  
     Do Until RS.EOF
        Debug.Print RS!銀行コード, RS!銀行名
        RS.MoveNext
    Loop
    RS.Close
    Set RS = Nothing
  End Sub

 こちらにもサンプルがあります。参考にしてください。

 

04.レコードタイプの使い分けのポイント

データを使う目的によってRecordsetのタイプを使い分ける必要があります。

 データの並べ替えやインデックスを利用してレコード操作を行う場合は、テーブルタイプを使用すると高速に処理
 できます。
 クエリで抽出したレコードを更新する場合は、ダイナセットを使用します。
 テーブルタイプを使えない状況で、レコードを単に参照する場合は、前方スクロールスナップショットを使うと、速く
 処理できます。

 

05.フィールドの参照方法

 フィールドオブジェクトには,作成した順番に0から始まるインデックス番号が付けられます。各フィールドを参照するには,このインデックス番号を使う方法と,フィールドに付けられた名前を使う方法があります。

Fields

学籍番号

氏名

フリガナ

クラス

・・・

0

1

2

3

・・・

1

  • インデックス番号を利用する

Recordset オブジェクトとFieldsコレクションをドット演算子(.)でつないで記述します。

【書式1recordset.Fields(インデックス番号)
 
 recordset: 開いているRecordsetオブジェクトを表すオブジェクト変数を指定します。
  • オブジェクトの名前を利用する
【書式2recordset.Fields(オブジェクト名)
 
 recordset: 開いているRecordsetオブジェクトを表すオブジェクト変数を指定します。
        (オブジェクト名はダブルクォーテーションで囲みます)
【書式3recordset.Fields!オブジェクト名
 
 recordset: 開いているRecordsetオブジェクトを表すオブジェクト変数を指定します。
【書式4recordset!オブジェクト名
 
 recordset: 開いているRecordsetオブジェクトを表すオブジェクト変数を指定します。
【例】次はいずれも上の図1のFieldsコレクションの「フリガナ」フィールドを参照する例です。
 
     RS.Fields(2)
     RS.Fields("フリガナ")
   RS.Fields!フリガナ
   RS!フリガナ  

【サンプルコード】次の例は「コード1」から「コード10」までのフィールドを「 For ~Next 」ループで操作する方法です。似たような名称のフィールド操作に利用すると便利です。

Sub Exsample()
 
    Dim DB As DAO.Database
    Dim RS As DAO.Recordset
    Dim i As Integer
     
    Set DB = CurrentDb
    Set RS = DB.OpenRecordset("T_追跡")
    
    RS.MoveFirst
    Do Until RS.EOF
        RS.Edit
            For i = 1 To 10
               RS("コード" & i) = Me("コード" & i)
                If RS("コード" & i) = "" Or Len(RS("コード" & i)) <> 8 Then
                     RS("コード" & i) = Null
                End If
            Next i
     
         RS.Update
         RS.MoveNext
    Loop
 
   
    RS.Close: Set RS = Nothing
    DB.Close: Set DB = Nothing
End Sub

 

你可能感兴趣的:(数据库ORACLE)