ADOとは、ActiveX Data Objectsの略でMicrosoft社が開発したRDBデータベースサーバにデータベース接続する為のプログラミングインタフェースです。
データベースサーバアクセスに主眼が置かれているものの汎用データベースアクセス技術OLE DB/Object Linking and Embedding Database(データベース用オブジェクトリンク・組み込みAPI)のCOM/Component Object Model(ソフトウェアの再利用技術)ラッパであるADOは、ISAM/Indexed Sequential Access Method(索引付き順次アクセスメソッド)採用のDB他SQLベースのDB、DAO同様、MS Accessはネットワーク越しでもローカルでも、またExcel、テキストファイルなどローカルファイルへもアクセスできます。
更にADOは、ActiveX技術を使っているのでウェブサーバ及びブラウザを利用するウェブシステム上でも利用でき、同じくMS社開発のIISやASP(Active Server Pages)からも利用する事ができます。
それでいて、その仕様は、DAOよりもかなりシンプルです。
ADOの背景にあるこれらOLE DB/COM/DAO/ActiveXなど一連の技術もMicrosoft社が提唱したものです。
ADOは、今となっては良いことずくめですが、ADOはRDO/DAOに代わる技術として開発されましたが、リリース当初からしばらくはローカルアクセスはDAOに依存せざるを得ず、共存してきた経緯があります。
現段階では、MicrosoftもDAOやVBに偏った感のあるRDOから、これら技術を包含するADO/ADO .NETへの全面移行を図っており、その集約は必要かつ妥当な選択と思われます。
例えば、VB6.0/VB .NETでADO/ADO .NETを利用する場合には、プログラムの参照設定で『Microsoft ActiveX Data Objects ? Library』を指定します(?にはバージョンが入ります)。
尚、ADOで可能な一連のデータアクセスを行えるようにする為には、少なくともVisual Basic for Applications/Visual Basic 実行時オブジェクトとプロシージャ/Visual Basic オブジェクトとプロシージャ/OLE Automationが参照設定されている必要があります。
VC++からADOを利用する場合には、少なくともmsadoで始まり2つの数値が続くmsado15.dllといったダイナミックリンクライブラリをimportします。
ADOの内部オブジェクトの階層は、これで全てで、それぞれにメソッドやプロパティがあり、DAOの複雑さに比べ、相当にシンプルです(DAO同様、末尾にsの付く階層はCollectionと呼ばれオブジェクトとは区別されます)。
object.method
object.property
ADOのオブジェクトにおけるメソッド、プロパティは、オブジェクトに続けてドット、メソッド名またはプロパティ名と記述することによって指定または参照します。
ADOオブジェクトを利用する際には、Newキーワードによってインスタンスを生成する必要があります。
その場合のインスタンス生成には、宣言時に同時にインスタンスを生成する場合とSetメソッドを使用して宣言とインスタンス生成を分ける場合の2通りがあります。
また、CreateObjectメソッドにより、オブジェクト型を生成する方法もあります。
尚、ADOのオブジェクトは、DAOと重複する場合が多いのでDAOと共存する場合でオブジェクトが重複する場合は必須、そうでなくても明確に区別する為に『New ADODB.Connection』や『ADODB.Recordset』などとする記述が推奨され、一般的ですし、動作もより確実です。
' 例)VB6.0 ADO
Sub DB_Open_of_ado()
...
' select文の場合
' insert/update/delete文の場合
cn.BeginTrans
cn.CommitTrans
cn.Close
END Sub
ConnectionString : オプション
UserID : オプション
Password : オプション
Options : オプション
このようにADO仕様は、DAOに比し、かなりシンプルに記述することができます。
ADODB.Connection.ExecuteによるSQL(select文)の結果であるレコードセットの参照、取得においてのループ中のレコード(行)の移動については、カーソルが利用可能か否か、利用可能な場合には、カーソルがサーバ側にあるのか、クライアント側にあるのかによって異なりますが、これらを設定するのがADOの場合、ADODB.Connection.CursorLocationプロパティです。
...
' ADODB.Connectionのカーソルプロパティ
' select文の場合
ADODB.ConnectionのCursorLocationプロパティを設定する場合には、当然と言えば当然ですがADODB.Connectionによる接続を確立した後に設定し、設定値とその意味は次の通りです。
' ADODB.Connection.CursorLocationプロパティ設定値
' ADODB.Recordsetのレコード移動用メソッド
ループ中のレコードセット内のレコード移動に利用する為のメソッドは、ADODB.Recordsetオブジェクト(例ではrs)のこれら4つですが、全て利用できるのはADODB.Connection.CursorLocationプロパティ設定値がadUseClientの時だけで、adUseSeverの場合、多くの環境ではMoveNextメソッドだけのようです。
尚、例えばクライアントバッチカーソルを利用する(adUseClientの)場合、予めレコードセットの全てをクライアント側で保持する必要があり、レコードセットのサイズが大きい場合には、それに応じて取得時のネットワーク上のトラフィック量が増え、メモリ上の格納領域も大きくなるということになります。
また、例えばサーバカーソルを利用する(adUseSeverの)場合、レコードセットのレコードを1行ずつ読み込む為、レコード件数(ADODB.Recordset.RecordCount)は全てのレコードを読み込むまで知ることができませんが、adUseClientの場合は、ループ前に把握することができます。
これらを勘案した上でレコードセットの操作方法を検討することになります。
ADOでは、DimステートメントまたはSetステートメントで型である右辺にNewキーワードを伴う場合があり、ADODB.ConnectionについてはADOオブジェクトの宣言と利用の通り、DimまたはSetステートメントの何れかで必ずNewキーワードを伴う必要があり、必須です。
しかし、ADODB.Recordsetについては、microsoft.com内ドキュメントでも記述がマチマチで明確な記述も、あるのかもしれませんが、まだ見つけるに至っていません。
そもそもSetステートメントの右辺がADODB.ConnectionのExecuteメソッドによるSELECT文である場合には、Newキーワードを付加したくても付加しようがないのでDimステートメントにNewキーワードがあるかと思いきやそれもないというドキュメントもあったりするのでRecordsetについては開くのが1つなら省略が可能なのかもしれません。
これらを踏まえて想像するにADOオブジェクトの階層からしてルートであるConnectionにはNewキーワードによる明示的なインスタンス生成が必要で、そのConnection型インスタンス内で開く(扱う)Recordsetが1つであれば、Newキーワードはあってもなくても可(ない場合にはRecordset型インスタンスが自動生成され)、2つ以上開く場合は、Newキーワードが必要ということなら辻褄は合う...と思い込むことにしていますが、とはいえADODB.Recordset.Cloneメソッド以外でRecordsetを2つ以上開く明快なケースのmsドキュメントを探し出せていないので実際のところはよくわかりません。
ADOの各オブジェクトには、個々に多くのプロパティがありますが、ここでは割愛させて頂きます。
.NET Framework対応ADOであるADO.NETは、データベース接続用クラスライブラリとして提供され、より簡単にデータベース接続を行うことができるようになっています。