DataReaderオブジェクト

■ データソースごとのクラス

接続の種類 クラス名
System.Data.SqlClient SqlDataReaderクラス
System.Data.OracleClient OracleDataReaderクラス
System.Data.OleDb OleDbDataReaderクラス
System.Data.Odbc OdbcDataReaderクラス
DataReaderオブジェクトの種類

 SqlDataReaderクラスは、データベースからSQL文の実行結果を読み込む際に使用するクラスです。データベースに接続した状態で使います。このクラスのメソッドを使って1件ずつ読み込むことができます。読み込むときにはカーソル(指し棒)の考え方を使います。カーソルを動かして、カーソルが指す行を読み込みます。

■ 主なプロパティ

プロパティ名 概要
Connection SqlDataReaderオブジェクトに関連付けられているSqlConnectionオブジェクトを取得する
FieldCount 現在の行の列数を取得する
HasRows SqlDataReaderオブジェクトに1行以上の行が格納されているかどうかを取得する
Item[Int32] 列の順番を指定して値を取得する
Item[String] 列名を指定して値を取得する
SqlDataReaderの主なプロパティ

■ 主なメソッド

メソッド名 概要
Close SqlDataReaderオブジェクトを閉じる
GetDouble 指定した列の値をdouble型として取得する
GetInt32 指定した列の値をint型として取得する
GetName 指定した列の名前を取得する
GetString 指定した列の値をstring型として取得する
GetValues 現在の行の値をオブジェクト配列に設定する
Read カーソルを次のレコードに進める
SqlDataReaderの主なメソッド

○ プロジェクト

 プロジェクトを作成して確認してみましょう。Usersテーブルからデータを読み込むプログラムを作成してみましょう。

プロジェクトの種類 コンソール アプリケーション
プロジェクト名 DataReaderTest

サンプルダウンロード

○ プログラム

 Mainメソッドに次のように記述してください。

Program.cs

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.Data.SqlClient;
  7. namespace CommandTest
  8. {
  9.  class Program
  10.  {
  11.   static void Main(string[] args)
  12.   {
  13.    //接続文字列
  14.    string constr = @"Data Source=(LocalDB)¥v11.0;AttachDbFilename=C:¥Work¥Books.mdf;Integrated Security=True;Connect Timeout=30";
  15.    //SqlConnectionオブジェクトを生成
  16.    SqlConnection con = new SqlConnection(constr);
  17.    //Usersテーブルのデータを取得するSQL文を作成
  18.    string sql = "SELECT * FROM Users";
  19.    //SqlCommandオブジェクトを生成
  20.    SqlCommand cmd = new SqlCommand(sql, con);
  21.    //データベースを開く
  22.    con.Open();
  23.    //SQL文を実行する
  24.    SqlDataReader dr = cmd.ExecuteReader();
  25.    //データリーダーの情報を表示する
  26.    Console.WriteLine("列数:{0}", dr.FieldCount);
  27.    Console.WriteLine("データがあるか?:{0}", dr.HasRows);
  28.    Console.WriteLine();
  29.    //データを取得する
  30.    while (dr.Read())
  31.    {
  32.     Console.Write("ID:{0} ", dr[0]);
  33.     Console.Write("ユーザー名:{0} ", dr["UserName"]);
  34.     Console.Write("パスワード:** ");
  35.     Console.Write("氏名:{0}", dr.GetString(3));
  36.     Console.WriteLine();
  37.    }
  38.    //データリーダーを閉じる
  39.    dr.Close();
  40.    //データベースを閉じる
  41.    con.Close();
  42.    Console.ReadLine();
  43.   }
  44.  }
  45. }

○ 実行結果

列数:4
データがあるか?:True

ID:1 ユーザー名:sato パスワード:** 氏名:佐藤
ID:2 ユーザー名:suzuki パスワード:** 氏名:鈴木
ID:3 ユーザー名:takahashi パスワード:** 氏名:高橋
ID:4 ユーザー名:tanaka パスワード:** 氏名:田中

○ 解説

 21行目で、Usersテーブルから全件取得するSQL文を作成しています。そして、30行目でSQL文を実行しています。ExecuteReaderメソッドはSqlDataReaderオブジェクトを返します。このオブジェクトを使って、SQL文の実行結果を取り出します。このオブジェクトは、初期状態でカーソルは1件目の前を指しています。データを読み込む場合は、38行目にあるようにReadメソッドを呼び出してカーソルをずらします。今回はWhile文の条件でReadメソッドを使っていますが、Readメソッドはカーソルで指すデータがなくなるとFalseを返すので、レコードがある間繰り返すようになります。

 40~43行目でカーソルが指しているレコードのデータを読み込んでいます。それぞれの行でデータの読み込み方を変えています。データを読み込み終わったのち、48行目でSqlDataReaderを閉じています。これ以降、SqlDataReaderを使ってSQL文の実行結果を読み込むことができなくなります。

データベースとDataReaderオブジェクトの関係
データベースとDataReaderオブジェクトの関係

 ここまで見てきたデータベースからデータを読み取る方法は接続型を利用しました。つまり、データベースに接続して処理をしました。データベースへの接続を閉じた後は処理ができません。

前へ   次へ