気の向くままに辿るIT/ICT/IoT
SQL用API

ADO/ActiveX Data Objects アクティブエックスデータベースオブジェクト

ホーム前へ次へ
ADO ActiveX Data Objects アクティブエックスデータベースオブジェクトとは?

ADO/ActiveX Data Objects

ADOとは

 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社開発のIISASP(Active Server Pages)からも利用する事ができます。

 それでいて、その仕様は、DAOよりもかなりシンプルです。

 ADOの背景にあるこれらOLE DB/COM/DAO/ActiveXなど一連の技術もMicrosoft社が提唱したものです。

 ADOは、今となっては良いことずくめですが、ADOはRDO/DAOに代わる技術として開発されましたが、リリース当初からしばらくはローカルアクセスはDAOに依存せざるを得ず、共存してきた経緯があります。

 現段階では、MicrosoftもDAOやVBに偏った感のあるRDOから、これら技術を包含するADO/ADO .NETへの全面移行を図っており、その集約は必要かつ妥当な選択と思われます。

ADOの利用

 例えば、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のオブジェクト階層

 Connection 
    |_Errors
    |    |_Error
    |_Commands
    |    |_Parameters
    |        |_Parameter
    |_Recordsets
        |_Fields
            |_Field

 ADOの内部オブジェクトの階層は、これで全てで、それぞれにメソッドやプロパティがあり、DAOの複雑さに比べ、相当にシンプルです(DAO同様、末尾にsの付く階層はCollectionと呼ばれオブジェクトとは区別されます)。

 object.method 

 object.property 

 ADOのオブジェクトにおけるメソッド、プロパティは、オブジェクトに続けてドット、メソッド名またはプロパティ名と記述することによって指定または参照します。

ADOオブジェクトの宣言と利用

 Dim cn As New ADODB.Connection 
 cn.Open ... 

 ADOオブジェクトを利用する際には、Newキーワードによってインスタンスを生成する必要があります。

 Dim cn As ADODB.Connection 
 Set cn = New ADODB.Connection 
 cn.Open ... 

 その場合のインスタンス生成には、宣言時に同時にインスタンスを生成する場合とSetメソッドを使用して宣言とインスタンス生成を分ける場合の2通りがあります。

 また、CreateObjectメソッドにより、オブジェクト型を生成する方法もあります。

 尚、ADOのオブジェクトは、DAOと重複する場合が多いのでDAOと共存する場合でオブジェクトが重複する場合は必須、そうでなくても明確に区別する為に『New ADODB.Connection』や『ADODB.Recordset』などとする記述が推奨され、一般的ですし、動作もより確実です。

ADOによるデータベース接続

 ' 例)VB6.0 ADO 

Sub DB_Open_of_ado() 

 Dim cn As New ADODB.Connection 
 Dim rs As New ADODB.Recordset 

 ... 

 ' Openメソッドに接続文字列を渡す
 cn.Open ConnectionString , UserID , Password , Options 

 ' select文の場合

  Set rs = cn.Execute " SELECT * FROM table_name " 
 while rs.EOF = False 
 ... 
 Wend    ' While end
 rs.Close 

 ' insert/update/delete文の場合

 cn.BeginTrans 

 cn.Execute " INSERT INTO table_name VALUES ( value1 , value2 , ...) " 
 cn.Execute " UPDATE table_name SET ...  " 
 cn.Execute " DELETE FROM table_name WHERE ...  " 

 cn.CommitTrans 

 ... 

 cn.Close 

 ' メモリ開放:タイミングはシステム依存 
 ' Set rs=Nothing 
 ' Set cn=Nothing 

END Sub 

 cn.Open ConnectionString , UserID , Password , Options 

 ConnectionString : オプション 

 セミコロン区切りの argument = value のセット 
  argument は Provider/File Name/URL等 

 UserID : オプション 

 認証用userID/アカウント名等 

 Password : オプション 

 認証用Password 

 Options : オプション 

 同期/非同期フラグ : adConnectUnspecified/adAsyncConnect 
 Openメソッドの戻りが接続後なら同期、接続前なら非同期 
 既定は同期/adConnectUnspecified 

 このようにADO仕様は、DAOに比し、かなりシンプルに記述することができます。

ADODB.Connection.CursorLocationプロパティ

 ADODB.Connection.ExecuteによるSQL(select文)の結果であるレコードセットの参照、取得においてのループ中のレコード(行)の移動については、カーソルが利用可能か否か、利用可能な場合には、カーソルがサーバ側にあるのか、クライアント側にあるのかによって異なりますが、これらを設定するのがADOの場合、ADODB.Connection.CursorLocationプロパティです。

 ... 
 Dim cn As New ADODB.Connection 
 Dim rs As New ADODB.Recordset 

 ... 

 cn.Open ConnectionString , UserID , Password , Options 

 ' ADODB.Connectionのカーソルプロパティ 

 ' cn.CursorLocation = adUseNone 
 ' cn.CursorLocation = adUseSever 
 ' cn.CursorLocation = adUseClient 

 ' select文の場合

  Set rs = cn.Execute " SELECT * FROM table_name " 
 while rs.EOF = False 
 ... 
 Wend    ' While end
 rs.Close 
 ... 

 ADODB.ConnectionのCursorLocationプロパティを設定する場合には、当然と言えば当然ですがADODB.Connectionによる接続を確立した後に設定し、設定値とその意味は次の通りです。

 ' ADODB.Connection.CursorLocationプロパティ設定値 

 ' adUseNone (カーソルなし) 
 ' adUseSever (サーバカーソルを利用) 
 ' adUseClient (クライアントカーソルを利用) 

 ' ADODB.Recordsetのレコード移動用メソッド 

 ' MoveFirst (先頭行へ移動) 
 ' MoveLast (最終行へ移動) 
 ' MovePrevious (前の行へ移動) 
 ' MoveNext (後ろの行へ移動) 

 ループ中のレコードセット内のレコード移動に利用する為のメソッドは、ADODB.Recordsetオブジェクト(例ではrs)のこれら4つですが、全て利用できるのはADODB.Connection.CursorLocationプロパティ設定値がadUseClientの時だけで、adUseSeverの場合、多くの環境ではMoveNextメソッドだけのようです。

 尚、例えばクライアントバッチカーソルを利用する(adUseClientの)場合、予めレコードセットの全てをクライアント側で保持する必要があり、レコードセットのサイズが大きい場合には、それに応じて取得時のネットワーク上のトラフィック量が増え、メモリ上の格納領域も大きくなるということになります。

 また、例えばサーバカーソルを利用する(adUseSeverの)場合、レコードセットのレコードを1行ずつ読み込む為、レコード件数(ADODB.Recordset.RecordCount)は全てのレコードを読み込むまで知ることができませんが、adUseClientの場合は、ループ前に把握することができます。

 これらを勘案した上でレコードセットの操作方法を検討することになります。

ADO Newキーワード

 ADOでは、DimステートメントまたはSetステートメントで型である右辺にNewキーワードを伴う場合があり、ADODB.ConnectionについてはADOオブジェクトの宣言と利用の通り、DimまたはSetステートメントの何れかで必ずNewキーワードを伴う必要があり、必須です。

 しかし、ADODB.Recordsetについては、microsoft.com内ドキュメントでも記述がマチマチで明確な記述も、あるのかもしれませんが、まだ見つけるに至っていません。

 ・Dim/Set共にNewキーワードなし 
 ・Dim/Set何れにもNewキーワードを指定 
 ・DimでのみNewキーワード指定 
 ・SetでのみNewキーワード指定 

 そもそも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オブジェクトのプロパティ

 ADOの各オブジェクトには、個々に多くのプロパティがありますが、ここでは割愛させて頂きます。

ADO.NET

 .NET Framework対応ADOであるADO.NETは、データベース接続用クラスライブラリとして提供され、より簡単にデータベース接続を行うことができるようになっています。

ホーム前へ次へ