So-net無料ブログ作成

ADOについて ACCESSのVBAでADOを使うための準備 [ADO]

 VBAからADOのオブジェクトライブラリを使用するには、最初に設定を行う必要があります。
 新規でACCESSのファイルを作成した場合などは、この設定がされていませんので、そのままADOのプログラムを記述してもエラーになります。

・設定手順

1.ACCESSのファイルを開きます。

 既存、新規どちらでもかまいません。
 ADOを使用するACCESSのファイルが開かれた状態にします。

続きを読む


ADO RecordCountプロパティの使用について考える [ADO]

 過去の記事でRecordCountプロパティを使用しても、正しく結果が得られないことがあると記載しましたが、Microsoftのサポート情報に詳しい説明があったので、試してみました。

 文書番号:194973

 どうやら、RecordsetをOpenする時のCursorTypeパラメタが影響するようです。
 RecordsetOpenについては、以下の記事をご参照下さい。
ADOについて その5 Recordsetオブジェクトのメソッド

続きを読む


ADOについて その5 Recordsetオブジェクトのメソッド [ADO]

 Recordsetのメソッドについて、よく使う物を中心に説明します。

・Open メソッド
指定されたSQLを実行し、Recordsetを開きます。

構文 recordset.Open Source, ActiveConnection, CursorType, LockType, Options

Source・実行するSQL文を指定します(省略可)。(実行結果をRecordsetで受け取るので、結果が帰ってくるSELECT文を使用します。INSERT・UPDATE・DELETEはExecuteで。)

ActiveConnection・Connectionオブジェクトを指定します(省略可)。接続されていること。

CursorType・カーソルタイプを指定します(省略可)。以下、指定できる内容。

adOpenDynamic・動的カーソル。
全機能ありカーソル。Recordsetを前方・後方に移動できて、他からデータに変更があった場合、それが反映されます。

adOpenForwardOnly(規定値)・前方専用カーソル。普通はこれを指定します
Recordsetを順番に読み出すことはできますが、戻ることはできません。MovePrevious は駄目ですが、MoveFirst は可能です。動作が単純な分、効率が良いようです。
また、静的カーソルと同様に、他からの更新は反映しません。

adOpenKeyset・キーセットカーソル。
動的カーソルとほぼ同じ機能。他でレコードの追加があった場合、それは反映されません。変更・削除は反映されます。

adOpenStatic・静的カーソル。
Open時に実行したSQL文の結果が、そのまま維持されます。Open後、別の処理からデータに更新がかかっても、Recoredsetから読み出されるデータは変化しません。
前方専用カーソルと違って、Recordsetの移動方向は自由です。

adOpenUnspecified ・指定無し。
ということは、たぶんDBのデフォルトになるかと思われます。省略時は、adOpenForwardOnlyです。

 基本的に、adOpenForwardOnlyです。なんでもアリのadOpenDynamicが良さそうに思えるかもしれませんが、処理中にデータが変わると、処理によっては正しい結果にならない可能性があります。
 adOpenForwardOnlyは、Recordsetを順番に読み出すことしか出来ませんが、大体の処理はそれで大丈夫です。

LockType・ロックの種類を指定します(省略可)。以下、指定できる内容。

adLockBatchOptimistic・共有的バッチ更新。

adLockOptimistic・レコード単位の共有的ロック。

adLockPessimistic・レコード単位の排他的ロック。

adLockReadOnly ・読み取り専用。
読み取り専用なので、追加・更新・削除はできません。ロックもかかりません。

adLockUnspecified ・指定なし。

 ロックについては、ちょっと難しいので詳しい説明は省略します。
私は単純に、データを読むだけで良い場合はadLockReadOnlyを、更新がある場合はadLockOptimisticを指定しています。

Options・CommandTypeEnumおよびExecuteOptionEnumの指定(省略可)。
コマンド引数の種類・コマンドの実行方法を指定するらしいですが、使ったことないです。

=-=-=-=-=-=-=-=-=-=-

・Close メソッド
Recordsetを閉じます。処理が終わったRecordsetは最後にCloseします。
Close後、再度Openすることも出来ます。その場合、SQLは再度実行され、新たな結果が取得されます。

構文 recordset.Close

=-=-=-=-=-=-=-=-=-=-

Requery メソッド

SQLを再実行して、最新の結果を取得し直します。Close->Openした場合と同じです。あまり使う機会は無いと思います。

構文 recordset.Requery

=-=-=-=-=-=-=-=-=-=-

AddNew メソッド

新規レコードを追加します。新規レコードを作成する場合、
AddNewメソッド->項目へ値のセット->Updateメソッド
の順番で処理します。

(AddNewのパラメタを使用することで、項目への値セットを一発で行うことも出来るようです。)

=-=-=-=-=-=-=-=-=-=-

Update メソッド

レコードセットに加えられた変更を保存します。新規レコードの追加、既存レコードの変更で使用します。

=-=-=-=-=-=-=-=-=-=-

Delete メソッド

カレントレコードを削除します(1件)。
(パラメタ指定で、複数レコードも削除できるようです。<-やったことはないです。)

=-=-=-=-=-=-=-=-=-=-

・MoveNext メソッド(次のレコードへ移動)

次のレコードへ移動します。

一般的な処理の場合、Open・MoveNext(EOFまで繰り返す)・Close、と言った流れになります。

以下、同系統のメソッドですが、使わないと思います。

・MovePrevious メソッド(前のレコードへ移動)
・MoveFirst メソッド(最初のレコードへ移動)
・MoveLast メソッド(最後のレコードへ移動)
・Move メソッド(指定されたレコード数分移動)

(adOpenForwardOnlyの場合、基本前に移動は出来ません。)

=-=-=-=-=-=-=-=-=-=-

・Find メソッド
・Seek メソッド(INDEXで検索)

現在取得しているRecordsetを、指定された条件で検索するメソッドです。
ある条件に当てはまるレコードを検索する場合、これらのメソッドを使用するより、目的のレコードが抽出されるSQL文を実行する方が早い場合が多いです。
これらを使用する場面は滅多にないと思います。

以下はまた今度。

=-=-=-=-=-=-=-=-=-=-

GetRows メソッド

GetString メソッド

Save メソッド

Cancel メソッド

CancelBatch メソッド

CancelUpdate メソッド

Clone メソッド

CompareBookmarks メソッド

NextRecordset メソッド

・・・SqlServerのストアドは、結果セットを複数返すことができるので、それを受け取るときに使う?

Resync メソッド

Supports メソッド

UpdateBatch メソッド


ADOとADO.NET [ADO]

 ADO.NETについてネットで調べると、ときどき「ADOの後継がADO.NET」という記述がありますが、ADOの機能と、ADO.NETの機能はまったく違うので、「後継」という表現は適切ではないと思われます。

 ADOの処理の特徴は、常にサーバに接続した状態で、Recordsetを使用して1件づつ逐次呼びすことです。
 対して、ADO.NETの場合は、Recordsetそのものがありません。処理対象のレコードをごっそりローカルに取り込んで、取り込んだら接続が解除されます。その後、ローカルのデータに対して更新を行い、その結果をまたまとめてサーバへ送り込みます。
 すばらしいのは、このローカルに取り込まれたデータに対する処理で、データベースに接続されていないのに、あたかもそこにデータベースが存在しているかのように、処理を行うことができます。プログラマがそこを意識してプログラムを書く必要が無いようになってます。
 (ADO.NETが登場する前は、プログラマーが自前でやっていたような気がします。)
 ただ、非接続の処理になっているので、リアルタイム性が重視されるプログラムには向かないようです。

 ADOはクライアントサーバ、常に接続ができる状態で効率よく処理が行える機能になっていて、ADO.NETは、それよりも遠い位置関係(ネットワーク上での)で処理を行う機能が実装されています。
 .NET系の開発ツールを使う場合に、ADO.NETを使わなければならない、と言うことでは無いと思います。

 ADO.NETは、その「.NET」が示唆するところのプログラムに適した機能になっているようです。


ADO Connection Executeメソッド [ADO]

 UPDATE、INSERT、DELETEのSQLを実行する場合は、ConnectionオブジェクトのExecuteメソッドを使用します。

続きを読む