検索
連載

第1回 ADO.NETでプログラミングを始める前に基礎解説 ADO.NET基礎講座 ―初めての.NETデータベース・プログラミング―(3/3 ページ)

.NET Frameworkの新機能ADO.NETを使って、データベースを扱うプログラミングに挑戦してみよう。まずはデータベースを準備し、その構造を知る。

Share
Tweet
LINE
Hatena
前のページへ |       

データベース・ビューアの作成

 MSDEしかインストールしていない場合、テーブルの一覧や、テーブル内のデータを確認するのが少々面倒だ。そこで、ADO.NETを利用した簡単なデータベース・ビューア「DBViewer」を作成してみた。次の画面はその実行画面だ。


データベース・ビューア「DBViewer」の実行画面
データベースとテーブルをマウスでクリックして選べば、そのテーブルの全レコードがカラム名付きで表示される。
  (1)インスタンスに含まれるデータベース一覧。
  (2)(1)のリスト・ボックスで選択したデータベースに含まれるテーブル一覧。
  (3)(2)で選択したテーブルに含まれる全データ。

 このプログラムは、「(local)\NetSDK」のインスタンスについて、左上のリスト・ボックスにそのデータベースの一覧が表示され、そこで選択したデータベースの全テーブルがその右側のリスト・ボックスに一覧される。さらにここで選んだテーブルの全データが下のグリッドに表形式で表示される。

 C#で記述したこのプログラムのリストは、次のようになっている。

using System;
using System.Windows.Forms;
using System.Drawing;
using System.Data;
using System.Data.SqlClient;

class DBViewer: Form {

  string databaseName;
  ListBox lstDB = new ListBox();
  ListBox lstTBL = new ListBox();
  DataGrid dg = new DataGrid();

  DBViewer() {
    this.Width = 800;
    this.Height = 600;
    this.Text = "DBViewer";

    lstDB.Location = new Point(10, 10);
    lstDB.Width = 200;
    lstDB.Height = 200;
    lstDB.DisplayMember = "name";
    lstDB.SelectedIndexChanged += new EventHandler(this.OnDatabase);

    lstTBL.Location = new Point(220, 10);
    lstTBL.Width = 200;
    lstTBL.Height = 200;
    lstTBL.DisplayMember = "name";
    lstTBL.SelectedIndexChanged += new EventHandler(this.OnTable);

    dg.Location = new Point(10, 220);
    dg.Width = 775;
    dg.Height = 330;
    dg.RowHeadersVisible = false;
    dg.Anchor = AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top;

    this.Controls.AddRange(new Control[] {lstDB, lstTBL, dg});

    lstDB.DataSource = getTable("master", "select name from sysdatabases");
  }

  void OnDatabase(Object s, EventArgs e) {
    databaseName = (string)((DataRowView)lstDB.SelectedItem).Row[0];
    lstTBL.DataSource = getTable(databaseName, "select name from sysobjects where xtype = 'U' or xtype = 'S' order by name");
  }

  void OnTable(Object s, EventArgs e) {
    string table = (string)((DataRowView)lstTBL.SelectedItem).Row[0];
    try {
      dg.DataSource = getTable(databaseName, "select * from [" + table + "]");
    } catch(Exception ex) {
      MessageBox.Show(ex.ToString());
    }
  }

  SqlConnection getConnection(string database) {
    string conn = "Server=(local)\\NetSDK; Trusted_Connection=yes; database=" + database;
    return new SqlConnection(conn);
  }

  DataTable getTable(string database, string query) {
    SqlDataAdapter sqlDA = new SqlDataAdapter(query, getConnection(database));

    DataTable dt = new DataTable();
    sqlDA.Fill(dt);

    return dt;
  }

  public static void Main() {
    Application.Run(new DBViewer());
  }
}

DBViewerのソース・コード(dbviewer.cs)
dbviewer.csのダウンロードはこちら

 このWindowsプログラムは、コマンド・プロンプトから次のようにしてコンパイルする。

csc /t:winexe dbviewer.cs

 “csc”は.NET Framework SDKに付属するC#のコマンドライン・コンパイラ、“/t:winexe”はコードをWindowsアプリケーションとしてコンパイルするオプションである。これにより、実行可能ファイル「dbviewer.exe」が作成されるはずだ。

 プログラムの最初の半分は、2つのリスト・ボックスとデータ・グリッドをWindowsフォーム上に表示するための処理だ。詳細は割愛させていただくが、OnDatabaseメソッドとOnTableメソッドはそれぞれ、データベース一覧とテーブル一覧のリスト・ボックスで項目を選択したときに呼び出される。

 プログラムの後半で行っているデータベースに関する処理については、次回以降の連載を読み進んでもらえれば、いずれ理解していただけるはずである。ここでは、いかにしてデータベース一覧、テーブル一覧、そしてテーブル内の全データを取得しているかを簡単に説明しておく。

■データベース一覧の取得

 インスタンス内にあるデータベースの一覧は、masterデータベース内のsysdatabasesテーブルに格納されている。nameカラムにデータベース名が入っているので、次のselect文により、データベース名の一覧が取得できる。

select name from sysdatabases
/* masterデータベースで実行 */

 せっかくなので、この様子をDBViewerで見ておこう。


masterデータベース内のsysdatabasesテーブルの内容
このテーブルからは、インスタンス内にあるデータベースの一覧を取得することができる。

■テーブル一覧の取得

*4 システムのためのテーブルについては、MSDNの「システム テーブル」の項目でその詳細を知ることができる。sysobjectsのオブジェクトの種類については「sysobjects」で解説されている。


 データベース名が決定すれば、そのデータベースに接続し、sysobjectsテーブルで管理されているオブジェクトの中から、xtypeカラムが「U」あるいは「S」のレコードのnameカラムを取り出せば、テーブルの一覧を取得できる。「U」と「S」は、SQL Server Enterprise Managerの画面で最初に見た、テーブルの種類である「ユーザー」と「システム」を表している*4。これを行うselect文は次のようになる。

select name from sysobjects
    where xtype = 'U' or xtype = 'S' order by name/* 各データベースで実行 */

 pubsデータベースのsysobjectsテーブルの内容は次のようになっている。


pubsデータベース内のsysobjectsテーブルの内容
sysobjectsテーブルには、データベースで管理されるすべてのオブジェクトのエントリが格納されている。テーブルもそのオブジェクトの1つだ。

 ちなみに、select文の最後にある「order by name」は、select文の条件にマッチするレコードをnameカラムのデータでソートして返せ、というselect文のオプションだ。テーブル一覧のリスト・ボックスの内容がソートされているのはこのためである。

■テーブル内の全データの取得

 以上の2つは少しトリッキーだが、テーブル内の全データ取得は、次のような最も単純なselect文となる(選択されているテーブルがpublishersの場合)。

select * from publishers


 以上、今回はかけ足でSQL Server(MSDE)の構造、テーブルの構造、SQL(select文だけだったが)などについて見てきた。本連載はADO.NETについての基礎解説なので、こういった解説はこのあたりでとどめておこう。SQL ServerやSQLについてより詳しく学びたければ、Master of IP Networkフォーラムの「連載 SQL実践講座」が参考になるだろう。

 さて次回は、ADO.NETによる「非接続型」でないデータベース・アクセスの方法について、まずはまとめてみる予定だ。

「基礎解説 ADO.NET基礎講座 ―― 初めての.NETデータベース・プログラミング ―― 」のインデックス

基礎解説 ADO.NET基礎講座 ―― 初めての.NETデータベース・プログラミング ―― 

Copyright© Digital Advantage Corp. All Rights Reserved.

前のページへ |       
ページトップに戻る