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を使用する。
|