[VC2005] データベースから DataSet オブジェクトにデータを設定する方法

◆概要

 Microsoft .NET Framework におけるデータ アクセスの主要な部分を担う DataSet オブジェクトは、テーブル、ビュー、およびリレーションシップを保持できるインメモリ オブジェクトです。この資料では、1 回以上のデータベース クエリの結果を使用して DataSet オブジェクトにデータを設定し、DataSet オブジェクトにデータが読み込まれた後、そのデータにアクセスする方法について説明します。


 この例では、C:\Program Files\Microsoft Visual Studio\VB98にある、AccessデータベースBIBLO.MDBに接続します

DataSet にデータを設定する

System.Data 名前空間に用意されているさまざまなオブジェクトを使用すると、データベース サーバーに接続してクエリを実行し、その結果を DataSet オブジェクトに設定できます。DataSet は非接続のオブジェクトです。そのため、データが読み込まれた後、データベースへの接続は、新しいデータを読み込んだり、インメモリ コピーの情報を変更してサーバーを更新したりするまで使用されません。

データベースから DataSet にデータを読み込むには、以下の手順を実行します。

  1. Visual Studio .NET を起動します。
  2. Visual C# .NET で新しいコンソール アプリケーション プロジェクトを作成します。Visual Studio .NET によって空の Main プロシージャと Static Class が作成されます。
  3. System、System.Data、および System.Data.SqlClient 名前空間に using ステートメントを使用して、後続のコードでこれらの名前空間を使用して宣言を修飾する必要がないようにします。これらのステートメントは他の宣言を行う前に使用する必要があります。
    using System;
    using System.Data;
    using System.Data.OleDb;
  1. データベースから DataSet にデータを取得する最初の手順は、データベース接続を確立することです。そのためには、System.Data.OleDbConnectionオブジェクトと接続文字列が必要です。以下のコードでは、ローカル コンピュータ (コードを実行しているコンピュータ) 上のAccessデータベースに接続する接続文字列を使用しています。この接続文字列は、使用中の環境に合わせて変更する必要があります。OleDbConnection オブジェクトが作成されたら、そのオブジェクトの Open メソッドを呼び出して実際のデータベース リンクを確立します。
    string sConnectionString;
    
    // 接続文字列の作成
    sConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" +
                   "Data Source=C:\\Program Files\\" +
                   "Microsoft Visual Studio\\VB98\\BIBLIO.MDB;" +
                   "Persist Security Info=false";
    
    // OleDbConnectionオブジェクトに接続文字列を設定して
    // データベース接続を確立します。
    OleDbConnection OleCn 
                  = new OleDbConnection(sConnectionString);
    // Open メソッドを呼び出して実際のデータベース リンクを確立します。
    OleCn.Open();
  1. データベースと DataSet オブジェクト間のリンクを表す DataAdapter オブジェクトを作成します。SQL または別の種類のコマンドを指定して、DataAdapter オブジェクトのコンストラクタの一部としてデータを取得できます。このサンプルでは、BIBLO.MDB データベースの Authors テーブルからレコードを取得する SQL ステートメントを使用します。
    // データベースと DataSet オブジェクト間のリンクを表す 
    // DataAdapter オブジェクトを作成します。
    OleDbDataAdapter daAuthors
       = new OleDbDataAdapter("SELECT * FROM Authors", OleCn);
  1. データの読み込みを開始する前に、DataSet オブジェクトを宣言してインスタンスを作成します。このとき、読み込むデータセットの名前を指定します。指定するデータセットには、別々の複数のテーブルを含めることができます。
    // DataSet オブジェクトを宣言してインスタンスを作成します。
    DataSet dsBiblo = new DataSet("Authors");
    
  1. OleDbDataAdapter クラスには、データの読み込みにおいて重要な役割を果たすメソッドが 2 つあります。Fill メソッドと FillSchema メソッドです。これらのメソッドは、いずれも DataSet に情報を読み込みます。Fill メソッドでは、データそのものが読み込まれます。これに対して FillSchema メソッドでは、特定のテーブルに関する利用可能なメタデータ (列名、主キー、制約など) がすべて読み込まれます。データを読み込むには、FillSchema の後に Fill を実行するのがよい方法です。例を次に示します。
    daAuthors.FillSchema(dsBiblo, SchemaType.Source, "Authors");
    daAuthors.Fill(dsBiblo, "Authors");

    Fill だけを使用した場合は、列名とデータ型を記述するために必要となる基本的なメタデータだけが読み込まれます。Fill メソッドでは主キーの情報は読み込まれません。このデフォルトの動作を変更するには、DataAdapter オブジェクトの MissingSchemaAction プロパティを MissingSchemaAction.AddWithKey に変更します。これにより、デフォルトの情報と共に主キー メタデータも読み込まれます。例を次に示します。
    daAuthors.MissingSchemaAction 
                   = MissingSchemaAction.AddWithKey;
    daAuthors.Fill(dsBiblo, "Authors");
  1. この時点で、データは DataSet の Tables コレクションに含まれる個々の DataTable オブジェクトとして利用できます。FillSchema および Fill を呼び出すときにテーブル名を指定した場合は、その名前を使用して目的のテーブルにアクセスできます。
    // テーブル名を使用して目的のテーブルにアクセスできます。 
    DataTable tblAuthors;
    tblAuthors = dsBiblo.Tables["Authors"];
    
  1. For Each ループを使用すると、DataTable の Rows コレクションに含まれるすべての DataRow オブジェクトをループ処理できます。この方法でテーブルの各行にアクセスできます。各列にアクセスするには、名前または位置を示すインデックス (最初の列の位置を '0' とする) を使用します。例を次に示します。
    // For Each ループを使用してDataTable の Rows コレクションに含まれる 
    // すべてのDataRow オブジェクトをループ処理します
    foreach (DataRow drCurrent in tblAuthors.Rows)
      {
          Console.WriteLine("{0} {1} {2}",
                drCurrent["Au_ID"].ToString(),
                drCurrent["Author"].ToString(),
                drCurrent["Year Born"].ToString());
      }
  1. データベースを接続するときにデータソース名が間違っているなど、正常にデータベースに接続できない場合も考えられますので、実際のプログラムでは、その際に発生する例外OleDbExceptionを捕らえて、例外が発生した場合の処理を記述しておいたほうが良いでしょう。また、正常に接続できた後でも、データベースにアクセスしている間に何らかの例外が発生する可能性が残っていますので、例外処理が終了した後にデータベースを切断できるようにClose()メソッドはfinally節の中で記述しておきます。
    using System.Data;
    using System.Data.OleDb;
    
    // ..... (省略) .....
    try
    {
       // Open メソッドを呼び出して実際のデータベース リンクを確立します。
        OleCn.Open();
       // ..... (省略) .....
        foreach (DataRow drCurrent in tblAuthors.Rows)
        {
             // ..... (省略) .....
        }
        Console.ReadLine();
    }
    catch (OleDbException ex)
    {
        //データベース接続エラーを処理する
        Console.WriteLine(ex.ToString());  
    }
    finally
    {
        OleCn.Close();  //接続を切断する
    }
  1. プロジェクトを保存します。[デバッグ] メニューの [開始] をクリックしてプロジェクトを実行します。プロジェクトが正しく動作することを確認します。

◆Sample code

using System;
using System.Data;
using System.Data.OleDb;

namespace ConsoleDatabase
{
    class Program
    {
        static void Main(string[] args)
        {
          string sConnectionString;
          // 接続文字列の作成
            sConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" +
                    "Data Source=C:\\Program Files\\" +
                    "Microsoft Visual Studio\\VB98\\BIBLIO.MDB;" +
                    "Persist Security Info=false";

          // OleDbConnectionオブジェクトに接続文字列を設定して
            // データベース接続を確立します。
            OleDbConnection OleCn
              = new OleDbConnection(sConnectionString);

            try
            {
              // Open メソッドを呼び出して実際のデータベース リンクを確立します。
                OleCn.Open();

              // データベースと DataSet オブジェクト間のリンクを表す 
                // DataAdapter オブジェクトを作成します。
                OleDbDataAdapter daAuthors
                     = new OleDbDataAdapter("SELECT * FROM Authors", OleCn);

              // DataSet オブジェクトを宣言してインスタンスを作成します。
                DataSet dsBiblo = new DataSet("Authors");

              // DataSet に情報を読み込みます。
                // Fill メソッドでは、データそのものが読み込まれます。
                // FillSchema メソッドでは、特定のテーブルに関する利用可能なメタデータ
                // (列名、主キー、制約など) がすべて読み込まれます。
                daAuthors.FillSchema(dsBiblo, SchemaType.Source, "Authors");
              // デフォルトの情報と共に主キー メタデータも読み込みます。
                daAuthors.MissingSchemaAction = MissingSchemaAction.AddWithKey;
              daAuthors.Fill(dsBiblo, "Authors");

              // テーブル名を使用して目的のテーブルにアクセスできます。 
                DataTable tblAuthors;
                tblAuthors = dsBiblo.Tables["Authors"];

              // For Each ループを使用してDataTable の Rows コレクションに
                // 含まれるすべてのDataRow オブジェクトをループ処理します
                foreach (DataRow drCurrent in tblAuthors.Rows)
                {
                    Console.WriteLine("{0} {1} {2}",
                        drCurrent["Au_ID"].ToString(),
                        drCurrent["Author"].ToString(),
                        drCurrent["Year Born"].ToString());
                }
                Console.ReadLine();
            }
            catch (OleDbException ex)
            {
              //データベース接続エラーを処理する
                Console.WriteLine(ex.ToString());  
            }
            finally
            {
                OleCn.Close();  //接続を切断する
            }
        }
    }
}

参考資料

アットマーク・アイティ ADO.NET基礎講座 初めての.NETデータベース・プログラミング

Visual C# .NET を使用してデータベースから DataSet オブジェクトにデータを設定する方法

▼ページトップへ