【入門編】ADOのCursorLocationプロパティがパフォーマンスに与える影響:Client vs Server – Access VBA解析バイブル

スポンサーリンク

こんにちは。現場の最前線でAccessと格闘している皆さん。
「Accessが重い」「ネットワークが詰まる」――そんな悩みに直面したとき、多くの人はクエリの書き方を疑います。もちろんそれも大切ですが、真のプロフェッショナルは「データの持ち方(カーソル)」に目を向けます。

今日は、ADO(ActiveX Data Objects)における `CursorLocation` という、あまり語られないけれど「運命を分ける設定」について、現場の知見を詰め込んで解説します。

—

1. カーソルとは何か?:データの「現在地」をどこに置くか

ADOでデータベースに接続する際、私たちは「このデータをどこで処理するのか?」を決めなければなりません。それが `CursorLocation` プロパティです。

選択肢は大きく2つ。

  • `adUseServer`(サーバー側カーソル): データベースエンジン側に処理を任せる。
  • `adUseClient`(クライアント側カーソル): データを一旦、自分のPCのメモリ(ローカル)に引きずり込む。

この違いをイメージで例えるなら、「レストランのキッチンで食べる(Server)」か「お弁当をテイクアウトして自宅で食べる(Client)」かの違いです。

—

2. どちらを選ぶべきか?実務視点の判断基準

adUseServer(サーバー側カーソル)

  • メリット: 大量のデータをサーバー側でソート・検索するため、ネットワークトラフィックが最小限で済む。
  • デメリット: 接続中ずっとサーバーとの通信が必要。接続が切れるとデータも消失する。
  • 向いているケース: サーバーのスペックが非常に高く、数百万件のレコードから数件だけをピンポイントで抽出するような処理。

adUseClient(クライアント側カーソル)

  • メリット: 一度取得すれば、サーバーとの接続を切っても手元で自由に並び替えやフィルタリングができる。
  • デメリット: 取得時に全データをPCのメモリにコピーするため、データ量が多いとPCがフリーズする。
  • 向いているケース: Access開発の9割はこちら。 ネットワーク経由の共有フォルダにあるMDB/ACCDBや、SQL Serverをバックエンドにする場合、安定性とレスポンス向上のために必須です。

—

3. 実践:CursorLocationを正しく設定するコード

では、実際にどのように書くのか。ここが一番のポイントです。

Public Sub ConnectWithADO()
Dim conn As ADODB.Connection
Dim rs As ADODB.Recordset

Set conn = New ADODB.Connection
Set rs = New ADODB.Recordset

‘ 接続文字列(環境に合わせて変更)
conn.ConnectionString = “Provider=SQLOLEDB;Data Source=ServerName;Initial Catalog=DBName;Integrated Security=SSPI;”
conn.Open

‘ 【重要】ここでカーソルの場所を決定する
‘ adUseClient を指定することで、ローカルPCのメモリ上で高速に操作が可能
rs.CursorLocation = adUseClient

‘ SQLを実行してデータを取得
rs.Open “SELECT FROM T_Sales”, conn, adOpenStatic, adLockReadOnly

‘ ここでデータを操作(ネットワークの負荷を気にせず扱える)
Debug.Print “レコード数: ” & rs.RecordCount

‘ 後始末(忘れるとメモリリークの元!)
rs.Close
conn.Close
Set rs = Nothing
Set conn = Nothing
End Sub

なぜ `adUseClient` を推奨するのか?

`adUseServer` を使うと、ネットワークが一瞬でも瞬断した瞬間に「接続が切断されました」というエラーが出ます。特にWi-Fi環境やVPN越しでの開発では致命的です。`adUseClient` にしてしまえば、一度取得したデータはPCのメモリ内にあるため、ネットワークの不安定さに左右されにくくなります。

—

4. 陥りやすい罠と対策

注意点:メモリの枯渇

`adUseClient` は便利ですが、`SELECT FROM 大量テーブル` をやってしまうと、PCのメモリを食いつぶします。「必要な列だけを指定する」「Where句で絞り込む」という基本を徹底してください。

注意点:データ整合性

ローカルにデータを持っている間、他人が同じデータを更新してもあなたの手元のデータには反映されません。「最新の状態」が必要なときは、定期的に `rs.Requery` を行うか、短時間で接続を閉じるように設計しましょう。

—

最後に:ここをクリアすれば、あなたはもう脱・初学者

「なんとなくコードをコピペして動かしている」状態から、「なぜこの設定にするのか」を意識する状態へ。この一歩を踏み出せたなら、あなたのAccess開発スキルは間違いなく一段階上に登っています。

`CursorLocation` は、あなたのアプリケーションが「重たい」と感じたときに、真っ先に調整すべきパラメータです。ぜひ自分の環境で、`adUseClient` に切り替えたときのレスポンスの変化を体感してみてください。

何か分からないことがあれば、いつでも聞いてくださいね。応援しています!

タイトルとURLをコピーしました