※当サイトの記事には、広告・プロモーションが含まれます。

VB6(Visual Basic6.0)とADO(ActiveX Data Objects)

VB6(Visual Basic 6.0) と VB.NETVisual Basic .NET)は互換性がないので、データベースへのアクセス方法も異なるようです。

⇩  VB6からVB.NETへの変遷について詳しくは下記サイトへ

VB6.0とVB.NETの違いってなんですか? - バージョンが違うとかそういう... - Yahoo!知恵袋

 

VB6でのデータベース接続

VB6のデータベース接続については、マイクロソフトAPIを利用するようです。

の3つの方法があるようです。

マイクロソフトのDAO(Data Access Objects)はDAO(Data Access Object)とは関係ありません。

VB.NETのデータベース接続については

を使って行うようです。

今回はADOについてメモしていきたいと思います。

マイクロソフトのDeveloper Networkの

Microsoft Data Access Components を使った OLE DB のリソース プーリング

を参考にすると、ADOでデータベース接続する場合は、OLEDB接続(Provider)かODBC接続(Driver)のどちらかを使うようです。

ADOの接続文字列に設定するPROVIDERとDRIVERの記述方法の違い --Access Club 超初心者 FORUM--

ADOでデータベース接続の概念図

f:id:ts0818:20170121163929p:plain

 

 

ADO(ActiveX Data Objects)

データソースアクセスを目的としたCOMオブジェクトのセットである。

ADOはOLE DBプログラミング言語を介在しており、プログラミングインターフェイスとして機能する。開発者はこれを用いることで、データベースの実装を意識せずにコードを書ける。

ADOはRDO(Remote Data Objects)DAO(Data Access Objects)の後継に位置づけられている。

ADOは1996年の冬、マイクロソフトにより発表された。後年、ADOの後継として.NET Frameworkに組み込まれたADO.NETがリリースされた。

https://ja.wikipedia.org/wiki/ActiveX_Data_Objects

データベース接続などを共通化してくれるもので、PHPなどでもphp.iniファイルを修正することで、使えるようです。

CX's Hello, World! » Hello, ADO(PHP) World!

 

OLE DB (Object Linking and Embedding, Database)

マイクロソフトの設計したAPIであり、一様な形で格納されている様々な種類のデータへのアクセスを行うものである。OLEDB、OLE-DB とも表記する。

Component Object Model(COM)を使って実装されたインタフェース群であり、そのためOLEと関係がある。

ODBCをより抽象化した形で置換するもので、関係データベース以外の各種データベースもサポートするよう拡張されている。オブジェクトデータベース表計算ソフトなどSQLをサポートしていないものにも対応している。

OLE DB - Wikipedia

とあるように、データベース以外にもSQLを使用しないデータのやり取りにも使うことができるようです。 

COM(Component Object Model)

マイクロソフトが提唱するソフトウェアの再利用を目的とした技術のことである。アプリケーションソフトウェア間での通信や、オペレーティングシステムアプリケーションソフトウェアとのAPIに用いられる。

COMを使用して開発されたソフトウェア部品をCOMコンポーネントと呼ぶ。

COMコンポーネントは、特定の開発言語に依存せず、C言語C++Visual BasicSmalltalkJavaなど、様々な言語により開発を行うことができる。

COMという用語はソフトウェア開発の世界ではOLE、OLEオートメーション、ActiveX、COM+、DCOMをカバーする包括的な用語としてよく使われる。

COMコンポーネントは、他ソフトウェアと通信するためのインタフェースを有している。

COMは主としてMicrosoft Windows上で使用されるが、UNIXMac OSでも使用することができる。

COMはまたソフトウェアコンポーネントシステムとしてCORBAJava Beansと競合関係にある。

Component Object Model - Wikipedia

COMコンポーネントであるADOは、VB6以外にも、いろんな言語に対応しているようです。また、同じくCOMコンポーネントであるOLE DBでデータベースを選択できるようです。 

⇩  COMコンポーネントについてなどは下記サイトへ

COMコンポーネントって何? - Visual Basic(VBA) 解決済 | 教えて!goo

COM の基礎

 

⇩  COMコンポーネントを自分で作る方法は下記サイトへ

COM プログラミング入門 - Web/DB プログラミング徹底解説

⇩  COMコンポーネントの問題点についてなどは下記サイトへ 

フリープログラミング団体 いかちソフトウェア

 

ADO(ActiveX Data Objects)の構造

ADO(ActiveX Data Objects)は名前からも想像できるように、オブジェクトの集合体になっているようです。

ADOActiveX Data Objects)

f:id:ts0818:20170121144628p:plain

Connection、Command、Recordset、および Field の各オブジェクトは、Properties コレクションも持っています。

⇩  詳しくは下記サイトへ

ADO オブジェクト モデル

 ADOActiveX Data Objects)の機能

オブジェクト名 機能
Connection データベースとの接続を行う
Command データベースに対する処理命令を保持
Recordset 操作対象となる実質的なデータの集合(レコードセット)を保持
Error 接続時のエラー情報を保持
Field Recordsetオブジェクト内のフィールドを保持
Property ADOオブジェクトの各種プロパティを保持

 

VB6の統合開発環境Visual Studio 6.0)が手に入らないので確認ができないのですが、 

Windows 2000 - Development Guide for Business Applications

によると、 ADOは、Visual Studio 6.0で『[プロジェクト]メニューから[参照設定]を選択し,表示されたウィンドウから“Microsoft ActiveX Data Objects 2.5 Library”を選択する』で使用することができるようです。

IDEであるVisual Basic 6.0にADOが用意されているように、デフォルトでCOMコンポーネントがある程度は用意されていると思われます、たぶん。

データベース接続 

あらかじめ、データベース(SQL Serverなど)を用意して適当なテーブルを作成しておきます。

データベース接続には、ADODBのConnectionオブジェクトを使います。

まずは、Connectionオブジェクトをインスタンス化します。 

宣言と代入を一度に

    Dim Cn As New ADODB.Connection

別々にかくこともできます。

    Dim Cn As ADODB.Connection
    Set Cn = New ADODB.Connection

ADODBの説明が見つからずよく分かりませんが、ADODBクラスという認識でいいのかしら?

ADOの各オブジェクトを使う際に必要みたいです。

ADOって、ADODB と ADODCの略語ですか? - ADODB と ADODCの違いは、本にも... - Yahoo!知恵袋

使用するデータベースなどの情報を用意します。コンピュータ名はデータベース(SQL Server)がインストールされているPCのものを指定します。

' 各設定情報を文字列後のための変数
Dim dbCon As String
' DB接続用の情報
' ドライバ名
Private Const CON_DRIVER = "Driver={SQL Server};"
' サーバー名
Private Const PUB_SEVNAME As String = "Server=コンピュータ名;"
' データベースファイル名
Private Const PUB_DBNAME As String = "Database=データベース名;"
' DB接続用の設定
dbCon = CON_DRIVER & PUB_SEVNAME & PUB_DBNAME

ConnectionオブジェクトのOpenメソッドでデータベースに接続します。

Cn.Open (dbCon)    

データベースに接続したら、テーブルのデータを扱いたいわけですが、それには、2つの方法があるようで、

  • ADODB.ConnectionオブジェクトのExecuteメソッドを使う方法
  • ADODB.RecordsetオブジェクトのOpenメソッドを使う方法

今回はADODBのRecordSetオブジェクトを使う方法です。

Dim Rs As New ADODB.Recordset

データベースに投げる投げるためのSQLを作成します。今回はSELECT文です。

'' SQLの作成
strSql = "SELECT * "
strSql = strSql & "FROM テーブル名 "    

sqlを実行するには、RecordsetオブジェクトのOpenメソッドを実行します。

Rs.Open strSql, Cn, adOpenForwardOnly, adLockReadOnly, adCmdText

RecordsetオブジェクトのOpenメソッドの引数については、

Windows 2000 - Development Guide for Business Applications

が詳しいです。

これで、データベースからデータが取得でき、ここではRsにデータがリストのような感じで1行ずつ格納されました。

これをすべて取り出すには、ループ処理をする必要がありますが、ADODB.RecordsetオブジェクトのEOFプロパティがRsに格納されている最後の行かどうかを判定してくれるので、これを繰り返し文の条件とすることで、PHPでいうところのforeach文のような処理をしてくれるみたいです。

Dim dbTableRow As String            ' 1行のデータ用の変数
Dim dbTableField As ADODB.Field
Dim dbTableFields As ADODB.Fields
Set dbTableFields = Rs.Fields
Dim arrayLengthMax As Long          ' データ数を保存する変数
Dim dbDataResult() As String        ' 配列を用意
    arrayLengthMax = 0              ' データ数初期化
Do Until Rs.EOF
    For intLoop = 0 To (objFields.Count - 1)
        dbTableRow = dbTableRow & dbTableField.Name & ":" & Rs.Fields(dbTableField.Name).Value
        If intLoop != (objFields.Count - 1) Then
            dbTableRow & ", "
        End If
    NEXT
    ' データ数を1つ増やす
    arrayLengthMax = arrayLengthMax + 1 
    ' 実際に配列の範囲を変更
    Redim Preserve A(1 To arrayLengthMax)
    dbDataResult(arrayLengthMax) = dbTableRow
Rs.MoveNext
Loop

ところどころ怪しい部分があるので、エラーになると思いますが、やりたかったことはデータベースから取得したデータを1行ずつ配列に格納したかった感じです。

やはりVB6を動かせる環境がないのは厳しいですね。

⇩  VB6の環境構築には結構なお金がかかるみたいですね。世知辛い世の中ですね。

Visual Basic 6.0 (VB6) のダウンロードについて -

 

今回はこのへんで。