MENU > HOME VB.NET VB6 VBA ソフトウェア リンク サイト情報
VB.NET> VB.NET 突撃レポート > 1  2  3  4  5  6  7  8  9  10  11  12 
PART8: ADO.NETによるデータベースアクセス その2 - DataSet オブジェクト -(2002年3月24日)

前回はADO.NETの初回ということで、OleDbConnection, OldDbCommand, OleDbDataReader といったオブジェクトを使用し、
従来と比較的類似した方法でデータベースへのアクセスを行ってみました。
今回はもう少し違った方法(ADO.NETの新機能)を使って行ってみたいと思います。

いまさらですが、System.Data ライブラリにある ネームスペース とそれらに属するADO.NET関連の主なクラス をここで紹介しておきます。

前回説明したとおり、SystemDataライブラリ以下には SQL Server 7.0 以降向けの SqlClient ネームスペースと
その他のOLEDB プロバイダ用のOleDbネームスペースがありそれぞれに Connection, Command, DataReaderオブジェクトが存在します。
これら3つのオブジェクトについては簡単ですが、前回取り扱ってみましたので、残された DataAdapter を試してみることにしましょう。

DataAdapter とはいったい何者なのでしょう?
このオブジェクトに関しては今までの ADO に類似するものはありません。
早速、MSDN(ヘルプ)で DataAdapter を参照してみます。

DataSet へのデータの格納およびデータ ソースの更新に使用される、一連のデータ コマンドおよびデータベース接続を表します。

なんて1文が記述されていました。
で、 「DataSet って何だ?」って事になりますよね。
前回ご紹介したとおり、ADO.Recordset に変わるものとして DataReader があると述べました。
この DataReader は ADO.Recordset と同様にデータソースへの接続型レコードセットであるのに対し、 DataSet は非接続型レコードセットです。
DataSet へは今までのように単一のレコードセットだけではなく、DataAdapter のFillメソッドにより 複数のレコードセットを コレクションする事が可能になり、
それらを従来のように SQLの発行により行っていた ソートやテーブルの結合といった機能もプロパティやメソッド等で提供されています。

さて、前置きが長くなると飽きちゃうので先に進みます。

今回は SQL Server 2000 を使用しますので、使用するオブジェクトは SqlDataAdapter です。

まずは実行環境を簡単にあげておきます
(SQL Serverが無い場合は MDBに同様のテーブルを作成し、以下のSql〜オブジェクトをすべてOleDb〜に読み替えてください)
 
サーバー Windows 2000 Server + SQL Server 2000
クライアント Windows XP Pro + Visual Studio.NET Professional

参照するテーブル TestDB.dbo.T_CATEGORY
 

CatID (int) Category (varchar(50))
1 Operating Systems
2 Office Applications
3 Development Tools

フォームにはButton1とButton2の2つのボタンを配置し、1つ目のボタンでデータを取り込んで、2つ目のボタンでデバッグ出力してみます。
MSDNのサンプルをまねまねで記述した結果、以下のようなコードになりました。

 
Option Strict On
'-- System.Data.SqlClientネームスペース
Imports System.Data.SqlClient

Public Class Form1
    Inherits System.Windows.Forms.Form

    Private oADP As SqlDataAdapter
    Private oDS As DataSet

[Windows Form Designer generated code]

    Private oADP As SqlDataAdapter
    Private oDS As DataSet

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        '-- DataAdapterの設定
        oADP = New SqlDataAdapter("SELECT * FROM T_CATEGORY", _
                                  "Data Source=SUGI-SERVER;Initial Catalog=TestDB;UID=sa;PWD=sa")
    End Sub

    Private Sub Form1_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
        oDS.Clear()
        oDS.Dispose()
        oDS = Nothing
        oADP.Dispose()
        oADP = Nothing
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        '-- レコードセットの取り込み
        oDS = New DataSet()
        oADP.Fill(oDS, "CATEGORY")
        Button1.Enabled = False
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim oRow As DataRow
        '-- データを出力してみる
        For Each oRow In oDS.Tables("CATEGORY").Rows
            Console.WriteLine(CStr(oRow("CatID")) & ", " & CStr(oRow("Category")))
        Next
    End Sub

End Class

簡単な説明になりますが、
2行目の Imports で System.Data.SqlClient ネームスペースをインポートしています。
Form1_Loadで DataAdapterに接続情報(SQLServer認証を使用しています)やSQLコマンドを指定しています。
Form1_Closingでは終了処理ということで DataSet オブジェクト、SqlDataAdapter オブジェクトを開放しています。
Button1_ClickではFillメソッドでデータセットを読み込むコードを記述。引数に DataSet オブジェクトを指定しているところがちょっと変わった使い方かな...。
第2引数でユーザー定義の名前を指定。(コレクションクラス内のメンバのKeyと同様です。)
Button2_ClickではFillで取り込んだDataSetの内容を順にデバッグ出力しています。
Dataset内では行のみならず列までもコレクションなのですね。

さて実行!

一応、正常動作し、

1, Operating Systems
2, Office Applications
3, Development Tools

のように出力されたのが確認できたかと思います。

じゃあ、本当に非接続なのかどうかLANケーブルでも抜いてみますか!

それではもう一度Button2をクリック。全く問題なし!

MDBで試している場合、MDBを開いている時に作成されるLDBファイル(ロック情報)が存在しないはずです。疑わしかったら、MDBを他の場所に移動してみても良いですよ。

SQL Serverなら、プロセス一覧を確認してみれば一目瞭然。


次回はもう少し進めて、Relation等を使ってみるつもりです。
 


今日の収穫
1. ADO.NETのレコードセットには接続型レコードセットである DataReaderと非接続型レコードセットであるDataSetがある。
2. DataSetとデータソース間のデータの取得および保存のためのブリッジとしてDataAdapterを使用する。


 

Copyright©Sugi. All rights reserved.