特集
NetDictionaryで始める
Webサービス・プログラミング

3.ADO .NETによるデータベース・アクセス


デジタルアドバンテージ
2002/02/06


 ICDデータベースに含まれるテーブル構造が明らかになったところで、いよいよプログラミングに入っていく。.NETにおいて、データベースを扱うプログラミングでは、ADO .NETを使用する。ADO .NETは、.NET Frameworkの一角をなす、データ・アクセスのためのフレーム・ワークである。

 ここではまず、簡単なADO .NETのサンプル・プログラムを用いて、ADO .NETの基本的なプログラミングを解説する。とはいっても、ICD Webサービスでのデータベース処理は検索のみで、データのinsert(挿入)やdelete(削除)、update(更新)は必要ないため、ここではその範囲での解説を行うだけに留める。

 次のプログラムは、ICDのデータベース・サーバに接続し、SQL文により先ほどの「見出し語名」テーブルより見出し語の「ID」とその「単語名」を取得するものだ。

 1: using System;
 2: using System.Data;
 3: using System.Data.SqlClient;
 4:
 5: public class ADONET {
 6:   public static void Main() {
 7:
 8:     string connstr
 9:      = "server=webservice02;uid=icduser;pwd=icdpw;database=ICD";
10:     SqlConnection conn = new SqlConnection(connstr);
11:
12:     string sqlstr = "select ID, 見出し語名 from 見出し語名";
13:     SqlDataAdapter da = new SqlDataAdapter(sqlstr, conn);
14:
15:     DataSet ds = new DataSet();
16:     da.Fill(ds, "icdtable");
17:
18:     DataTable dt = ds.Tables["icdtable"];
19:     DataRow   dr = dt.Rows[0];
20:
21:     Console.WriteLine(dr["ID"]);
22:     Console.WriteLine(dr["見出し語名"]);
23:
24:     foreach (DataRow dr_tmp in dt.Rows) {
25:       Console.WriteLine("{0} - {1}", dr_tmp[0], dr_tmp[1]);
26:     }
27:   }
28: }
ADO .NETのサンプル・プログラム
「見出し語名」テーブルより見出し語の「ID」とその「単語名」を取得する。

 このプログラムは、4つのパートに分けることができる。最初の処理は、SqlConnectionオブジェクトの生成である。このオブジェクトは、データベースとの接続のために使用される。

 8: string connstr
 9:   = "server=webservice02;uid=icduser;pwd=icdpw;database=ICD";
10: SqlConnection conn = new SqlConnection(connstr);

 引数には、データベースへの接続方法を伝えるための「接続文字列」と呼ばれる文字列を指定する。接続文字列には、接続先のサーバ名(ここでは“webservice02”)、ログオンに利用されるユーザー名(ここでは“icduser”)とパスワード(ここでは“icdpw”)、接続するデータベース名(ここでは“ICD”)を記述する必要がある。

 次にデータベース上で実行するSQL文と、今生成したSqlConnectionオブジェクトを指定して、SqlDataAdapterオブジェクトを生成する。このオブジェクトは、その名前の通りデータベースとプログラムの接点となり、データの転送を行う。

12: string sqlstr = "select ID, 見出し語名 from 見出し語名";
13: SqlDataAdapter da = new SqlDataAdapter(sqlstr, conn);

 ただしこの段階では、まだ指定したSQL文は実行されない。続いて、このオブジェクトのFillメソッドを実行することによりSQL文がデータベース上で実行され、プログラムでその結果を受け取ることができる。

 Fillメソッドを実行する前に、受け取ったデータを格納するための入れ物が必要となる。この役目を果たすオブジェクトはDataSetオブジェクトである。

15: DataSet ds = new DataSet();
16: da.Fill(ds, "icdtable");

 DataSetは非常にパワフルなオブジェクトだ。これはその内部にデータベースのテーブルの一部(あるいは全部)のコピーを保持することができる。1つのDataSetオブジェクトに複数のテーブルを保持することもでき、またデータベースのようにテーブルに対するプライマリ・キーや、テーブル間のリレーションも保持することができる。

 DataSetのオブジェクトを引数としてSqlDataAdapterのFillメソッドを実行することによって、データベースの検索結果でDataSetが満たされる。このときFillメソッドの第2引数には、DataSet内のテーブルに対する名前(ここでは“icdtable”)を指定することができる(この名前は実際のテーブルと同じである必要はない)。

 最後は、DataSetに受け取った実データにアクセスし、その表示を行っている。このためには最低限、DataTableオブジェクトとDataRowオブジェクトを含んだDataSetオブジェクトの階層構造を理解しておく必要がある。次の図はこの構造を示したものだ。

DataSetオブジェクトの階層構造
ここでは、DataTableオブジェクトとDataRowオブジェクトについてのみ示している。

 まずDataSetは、1つのテーブルに対応したDataTableオブジェクトの集合(コレクション)であるDataTableCollectionオブジェクトを含んでいる。このコレクションは、DataSetのTablesプロパティでアクセスすることができる。次の行は、先ほどFillメソッドによりDataSet内に作成された“icdtable”テーブルのDataTableオブジェクトを取得している。

18: DataTable dt = ds.Tables["icdtable"];

 C#のインデクサにより、コレクションを名前でアクセスしているが、これは“ds.Tables[0]”として数値によるインデックスでアクセスすることも可能だ。

 同じようにDataTableは、1つのレコードに対応したDataRowオブジェクトのコレクションであるDataRowCollectionオブジェクトを含んでいる。このコレクションは、DataTableのRowsプロパティによりアクセスすることができる。

 次の行は、検索によって得られた最初のレコードをDataRowオブジェクトとして取得している。

19: DataRow dr = dt.Rows[0];

 DataRowオブジェクトにアクセスできれば、これに対するインデクサにより、テーブルのカラム名をキーとして、各カラムの値を手に入れることができる。

21: Console.WriteLine(dr["ID"]);
22: Console.WriteLine(dr["見出し語名"]);

 DataTableと同様に、インデックス番号により各カラムの値をアクセスすることもできる。つまり、dr["ID"]はdr[0]と、dr["見出し語名"]はdr[1]と同じである。DataRowの持っているデータの順番はselect文で列挙したカラムの順番である。ここまでDataTable、DataRowと順を追って記述してきたが、この2つの値はそれぞれ次のように1行で記述することもできる。

Tables["icdtable"].Rows[0]["ID"]
Tables["icdtable"].Rows[0]["見出し語名ID"]

 サンプル・プログラムの一番最後では、foreach文により検索結果のすべてのレコードを表示している。ちなみにDataTableに含まれているDataRowオブジェクトの数(検索結果のレコード数)は、ここでは“ds.Tables[0].Rows.Count”により得ることができる。

24: foreach (DataRow dr_tmp in dt.Rows) {
25:   Console.WriteLine("{0} - {1}", dr_tmp[0], dr_tmp[1]);
26: }

 このサンプル・プログラムの実行結果は次のようになる。

サンプル・プログラムの実行結果
最初の2行はTables["icdtable"].Rows[0]にある2つのカラムの値を示している。3行目以降は、foreach文により検索結果の値をすべて列挙している。
 

 INDEX
  [特集]NetDictionaryで始めるWebサービス・プログラミング
  第4回 辞書データベースへのアクセス
    1.ヘルプ・ページのテンプレート
    2.ICDデータベースの構造
  3.ADO .NETによるデータベース・アクセス
    4.ICD Webサービスのデータベース処理
 
 特集 : NetDictionaryプロジェクト


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間