ADO接続におけるロックとカーソルの詳細解説(Accessの場合)

こんにちは!大阪市住之江区に拠点を置く会社『縁紡ぐ』の稲垣です。

当社は、Excel、ACCESS、RPAなどのシステム開発や既存ツールを使った業務効率化の提案、また、ITスキルアップのための教育に力を入れています。効率的なビジネス運営を目指している企業様、ITスキルの向上を図りたい企業や個人の方に、最適なご提案をさせていただきます。業務プロセスの改善とITスキルアップをサポートし、共に成長するパートナーでありたいと考えています。

目次

ADO接続の基本

ADO(ActiveX Data Objects)は、データベースとの接続を簡単に行うための強力なツールです。ADOを使用することで、データベースに接続し、クエリを発行し、結果を取得することができます。ここでは、ADOでの接続からクエリの発行、そして接続のクローズまでの一連の流れと、ロックやカーソルの種類について詳しく解説します。

他にもDAO接続もありますが、DAOはMicrosoft製品にしか使用できないので、ADO接続を使って方が、色んなDBに対応することができます。

今回は、ACCESSへの接続を例に紹介します。

全体の流れ

以下は、Microsoft Accessデータベースに接続し、クエリを発行して結果を取得する全体の流れを示すVBAコードです。ここでは、クエリを変数に代入し、カーソルの種類とロックタイプを名称で指定しています。

Sub AccessDataExample()
    ' ADOオブジェクトの宣言
    Dim conn As Object
    Dim rs As Object
    Dim connectionString As String
    Dim sql As String

    ' コネクションの作成
    Set conn = CreateObject("ADODB.Connection")
    connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=パス\データベース名.accdb;"
    conn.Open connectionString

    ' SQLクエリを変数に代入
    sql = "SELECT * FROM テーブル名 WHERE 条件"

    ' クエリの発行(ロックタイプとカーソルの種類を指定)
    Set rs = CreateObject("ADODB.Recordset")
    rs.Open sql, conn, adOpenKeyset, adLockOptimistic ' カーソルとロックは名称で指定

    ' 結果の取得
    Do While Not rs.EOF
        Debug.Print rs.Fields("カラム名").Value
        rs.MoveNext
    Loop

    ' カウントの取得
    rs.Close
    rs.Open "SELECT COUNT(*) AS TotalCount FROM テーブル名 WHERE 条件", conn
    If Not rs.EOF Then
        Debug.Print "総件数: " & rs.Fields("TotalCount").Value
    End If

    ' クローズ処理
    rs.Close
    Set rs = Nothing
    conn.Close
    Set conn = Nothing
End Sub

コネクションの作成

まず最初に、Accessデータベースへの接続を行います。コネクションオブジェクトを作成し、適切な接続文字列を設定します。

Set conn = CreateObject("ADODB.Connection")
connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=パス\データベース名.accdb;"
conn.Open connectionString

説明CreateObjectでADODB.Connectionオブジェクトを作成し、接続文字列を指定して接続を開きます。ここでは、Accessデータベースの接続に必要なプロバイダーを指定しています。

 クエリの発行

接続が成功したら、次はクエリを発行します。Commandオブジェクトを使用して、SQL文を実行します。

sql = "SELECT * FROM テーブル名 WHERE 条件"

説明: SQLを文字列として変数に代入します。

rs.Open sql, conn, adOpenKeyset, adLockOptimistic ' カーソルとロックは名称で指定

説明Openメソッドを使用してSQL文を指定し、adOpenKeysetをカーソルの種類として、adLockOptimisticをロックタイプとして指定します。最後に、それぞれの種類について解説をします

 結果の取得

クエリを実行した後、結果セットはRecordsetオブジェクトとして返されます。このオブジェクトを使って、取得したデータを操作します。

Do While Not rs.EOF
    Debug.Print rs.Fields("カラム名").Value
    rs.MoveNext
Loop

説明Do Whileループを使って、結果セットの各行を処理します。EOF(End Of File)プロパティを使って、最後の行に達するまでループを続けます。

カウントが正しく取得できない場合

場合によっては、RecordCountプロパティを使用しても、正確な行数を取得できないことがあります。特に、adCursorForwardOnlyカーソルを使用している場合、RecordCountは常に-1を返します。このため、行数をカウントする必要がある場合は、クエリ内でCOUNT関数を使用することをお勧めします。

縁紡ぐ

レコード数を調べたいときは、COUNT関数を使うと確実ですね

rs.Close
rs.Open "SELECT COUNT(*) AS TotalCount FROM テーブル名 WHERE 条件", conn
If Not rs.EOF Then
    Debug.Print "総件数: " & rs.Fields("TotalCount").Value
End If

説明COUNT(*)を用いることで、条件に合った総件数を取得します。この方法であれば、カーソルの種類に関わらず正確なカウントが可能です。

クローズ処理

データ処理が終わったら、必ず接続と結果セットをクローズします。これにより、リソースを解放します。

rs.Close
Set rs = Nothing
conn.Close
Set conn = Nothing

説明Closeメソッドを使って、RecordsetとConnectionを閉じます。そして、オブジェクトをNothingに設定してメモリを解放します。

縁紡ぐ

必ずデータベースとの接続はクローズしましょう

ADO接続におけるロックの種類とカーソルの種類

ADOでは、データの整合性を保ちながら操作を行うために、ロックの種類とカーソルの種類を指定することが重要です。以下に、ロックとカーソルの種類をそれぞれ表形式でまとめました。

ロックタイプの種類

ロックタイプ説明使用例
adLockReadOnly読み取り専用のロック。他のユーザーがデータを変更できない。データを表示するだけの場合。
adLockPessimistic他のユーザーが更新できないようにするロック。データを取得した時点でロック。一時的な編集を行う場合。
adLockOptimistic更新時にのみロックをかける。データ取得時はロックしない。データが頻繁に変更されない場合の更新。
adLockBatchOptimistic複数の行を一度に更新するための楽観的ロック。バッチ処理を行う場合。

カーソルの種類

カーソルの種類説明使用例
adOpenStatic結果セットが固定され、他の変更が反映されない。一度取得したデータを表示する場合。
adOpenDynamic結果セットが動的に変化し、他の変更がリアルタイムで反映される。リアルタイムデータを表示する場合。
adOpenForwardOnly行を前方向にのみ移動できる。メモリ使用量が少なく、パフォーマンスが良い。大量データを順番に処理する場合。
adCursorKeyset現在の状態を保持し、他のユーザーの変更は反映されない。ユーザーが特定のデータを編集する場合。

まとめ

ADO接続を使用することで、データベースと簡単にやり取りができます。コネクションの作成からクエリの発行、結果の取得、クローズ処理までの流れを理解することが重要です。また、ロックやカーソルの種類を把握することで、データの整合性を保ちながら効率的なデータ操作が可能になります。

何か他に質問があれば、ぜひ教えてくださいね!

記事を書いた人

稲垣

  • Excel、ACCESSでのシステム開発が得意
  • ITスキルを共有し実践的に学びながら成長する人を見るのが幸せ
  • 自家焙煎するほどのコーヒー好き
  • 使用言語 VBA、Python、Javascript、Java、HTML、CSS etc.
  • 保有資格 Kintoneアソシエイト、日商簿記検定2級、マンション管理士、管理業務主任者、情報セキュリティマネジメント、ExcelVBA etc.
  • 業務フロー図の作成や業務時間分析を通して、効率化ポイントを探る人
  • お客様にとって本当に良いことかを第一に考える人
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次