MSDEしかインストールしていない場合、テーブルの一覧や、テーブル内のデータを確認するのが少々面倒だ。そこで、ADO.NETを利用した簡単なデータベース・ビューア「DBViewer」を作成してみた。次の画面はその実行画面だ。
このプログラムは、「(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());
}
}
この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で見ておこう。
■テーブル一覧の取得
*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テーブルの内容は次のようになっている。
ちなみに、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による「非接続型」でないデータベース・アクセスの方法について、まずはまとめてみる予定だ。
Copyright© Digital Advantage Corp. All Rights Reserved.