DataReaderオブジェクト
System.Data.SqlClient名前空間: 「SqlDataReader」
System.Data.OracleClient名前空間:「OracleDataReader」
System.Data.OleDb名前空間: 「OleDbDataReader」
SqlDataReaderクラスは、Commandオブジェクトを使って、データベースからデータを読み込む際に生成されます。アプリケーションはこのクラスのオブジェクトを使って、抽出されたデータを読み込んで使用します。
■ 主なプロパティ
■ FieldCountプロパティ
現在の行の列数を取得します。
■ HasRowsプロパティ
SqlDataReaderに1行以上の行が格納されているかどうかを取得します。
■ 主なメソッド
■ Closeメソッド
SqlDataReaderオブジェクトを閉じます。
■ Get~メソッド
指定した列の値を~値として取得します。
(~値:Boolean、Byte、Char、DateTime、Decimal、Double、Float、Int16、Int32、Int64、String)
■ GetNameメソッド
指定した列の名前を取得します。
■ IsDBNullメソッド
列に格納されている値が存在しないかどうかを調べます。
■ Readメソッド
SqlDataReaderを次のレコードに進めます。
このオブジェクトはCommandオブジェクトの「ExecuteReaderメソッド」を使って実行すると生成されます。DataReaderクラスは抽出したデータを表わすオブジェクトになります。このオブジェクトを使ってデータを利用します。
Readメソッドを使って、読み込む行を進め、Get~メソッドを使って実際にデータを取得します。
DataReaderオブジェクトを使って読み込む記述をしましょう。記述する方法がいくつかあります。ひとつは先ほどあげた、Get~メソッドを使う方法、ひとつは、DataReaderのItemプロパティを使う方法です。そして、もうひとつは、読み込んだ行を一気に読み込む方法です。
○ プロジェクト
プロジェクトを作成して確認してみましょう。Usersテーブルからデータを読み込むプログラムを作成してみましょう。
プロジェクトの種類 |
Windows フォーム アプリケーション |
プロジェクト名 |
DataReaderTest1 |
サンプルダウンロード
○ フォームデザイン
次の図のようにコントロールを配置してください。
コントロールの配置例
○ プログラム
「接続」ボタンをクリックしたときのイベントプロシージャの記述をしてください。
Form1.vb
- Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
- '接続文字列を作成する
- Dim conString As String = _
- "Data Source=.;AttachDbFilename=C:¥Work¥Books.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True"
- 'コネクションオブジェクトを生成する
- Dim con As New SqlClient.SqlConnection(conString)
- 'SQL文を生成する
- Dim sql As String = "SELECT * FROM M_ユーザー"
- 'コマンドオブジェクトを生成する
- Dim cmd As New SqlClient.SqlCommand(sql, con)
- 'データベースに接続する
- con.Open()
- 'コマンドを実行する
- Dim dr As SqlClient.SqlDataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection)
- '情報を表示する
- While dr.Read
- Dim str As String = dr.GetString(0) & " " & dr.GetString(1) _
- & " " & dr.GetString(2) & " " & dr.GetString(3)
- Me.ListBox1.Items.Add(str)
- End While
- 'データベースを閉じる
- con.Close()
- End Sub
○ 実行結果
実行結果
今回のサンプルはデータベースに選択のコマンドを実行した際に作成されるDataReaderオブジェクトを「dr」という名前の変数で受け取って、利用しています。その際、そのオブジェクトのGetStringメソッドを使用して指定した列の値を読み込んでいます。指定する方法は引数として読み込みたい列のインデックスを渡します。このインデックスはテーブルの列の順で「0」から始まる番号です。
While文を使ってループさせていますが、DataReaderオブジェクトのReadメソッドを実行した結果Trueの場合はデータが存在し、Falseの場合はデータが存在しません。データが存在する間、ループ処理をすることになります。
このサンプルでは、読み込んだ行をListBoxの項目として追加して、表示します。
では、このサンプルと同じものを今度はほかの読込方法を使って作成してみましょう。
○ プロジェクト
プロジェクトの種類 |
Windows フォーム アプリケーション |
プロジェクト名 |
DataReaderTest2 |
サンプルダウンロード
○ フォームデザイン
「DataReaderTest」プロジェクトと同じようにコントロールを配置してください。
○ プログラム
「接続」ボタンをクリックしたときのイベントプロシージャの記述をしてください。
Form1.vb
- Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
- '接続文字列を作成する
- Dim conString As String = _
- "Data Source=.;AttachDbFilename=C:¥Work¥Books.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True"
- 'コネクションオブジェクトを生成する
- Dim con As New SqlClient.SqlConnection(conString)
- 'SQL文を生成する
- Dim sql As String = "SELECT * FROM M_所在地"
- 'コマンドオブジェクトを生成する
- Dim cmd As New SqlClient.SqlCommand(sql, con)
- 'データベースに接続する
- con.Open()
- 'コマンドを実行する
- Dim dr As SqlClient.SqlDataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection)
- '情報を表示する
- While dr.Read
- Dim str As String = dr("所在地ID") & " " & dr("所在地名") & "" _
- & dr("住所") & " " & dr("電話番号") & " " & dr("FAX番号")
- Me.ListBox1.Items.Add(str)
- End While
- 'データベースを閉じる
- con.Close()
- End Sub
○ 実行結果
実行結果
今回のサンプルは先回のサンプルとほとんど同じですが、DataReaderで読み込んだデータを使用する際に、Itemプロパティを使い、引数として列名を直接指定しました。結果は先回と同じですが、読み込まれたデータはObject型になります。
次にまとめて読み込む方法を試してみましょう。
○ プロジェクト
プロジェクトの種類 |
Windows フォーム アプリケーション |
プロジェクト名 |
DataReaderTest3 |
サンプルダウンロード
○ フォームデザイン
「DataReaderTest」プロジェクトと同じようにコントロールを配置してください。
○ プログラム
「接続」ボタンをクリックしたときのイベントプロシージャの記述をしてください。
Form1.vb
- Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
- '接続文字列を作成する
- Dim conString As String = _
- "Data Source=.;AttachDbFilename=C:¥Work¥Books.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True"
- 'コネクションオブジェクトを生成する
- Dim con As New SqlClient.SqlConnection(conString)
- 'SQL文を生成する
- Dim sql As String = "SELECT * FROM M_分類"
- 'コマンドオブジェクトを生成する
- Dim cmd As New SqlClient.SqlCommand(sql, con)
- 'データベースに接続する
- con.Open()
- 'コマンドを実行する
- Dim dr As SqlClient.SqlDataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection)
- '必要な変数を用意する
- Dim str As String = ""
- Dim str_data(dr.FieldCount - 1) As Object
- Dim i As Integer
- '情報を表示する
- While dr.Read
- Dim cnt As Integer = dr.GetValues(str_data)
- For i = 0 To cnt - 1
- str &= str_data(i) & " "
- Next
- Me.ListBox1.Items.Add(str)
- str = ""
- End While
- 'データベースを閉じる
- con.Close()
- End Sub
○ 実行結果
実行結果
今回のサンプルは1行分のデータを配列に読み込んで利用しました。その際に、GetValuesメソッドで引数に用意した配列を渡します。すると、その中に、1行分のデータが各要素に格納されます。後は、その配列の要素にアクセスして利用することができます。
前へ 次へ