こんにちは!大阪市住之江区に拠点を置く会社『縁紡ぐ』の稲垣です。
当社は、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.
- 業務フロー図の作成や業務時間分析を通して、効率化ポイントを探る人
- お客様にとって本当に良いことかを第一に考える人
コメント