Visual Studio 2008を使って簡単なWebアプリを作ってみる(2)

もう今日から会社は年末年始のお休みに入ったけど、Visual Studio 2008を使って簡単なWebアプリ(掲示板)を作ってみる勉強の続き。前回はデータベースを用意して画面にその内容を表示するところまでをやった。今回は掲示板に投稿できるようにする。

テーブル定義の変更

まず最初に、Bbsのプライマリーキーのid列を自動で採番するようにテーブル定義を直す。いわゆるオートナンバー型にするわけだ。

  1. データベース エクスプローラのBbsテーブルの上で右クリック
  2. 「テーブル定義を開く」を選択
  3. idのところの「IDENTITY の指定」の横の「+」をクリック
  4. (Is Identity)のところを「いいえ」から「はい」に変更
  5. Ctrl + Sを押す

これでid列は自動採番されるようになった。alter table文とかは書かなくて良い。

レコードを追加するSQL

Bbsテーブルにレコードを1件追加するメソッドを作る。つまり、Insert文を発行してくれるメソッドをBbsTableAdapterに追加するわけだ。

  1. ソリューション エクスプローラの「DataSet.xsd」をダブルクリックして開く
  2. ツールボックスの「Query」を、開いた画面のBbsテーブルのところにドラッグ & ドロップ

こうすると「TableAdapter クエリの構成ウィザード」が開く。あとはここにSQL文を入れるだけだ。

  1. SQL ステートメントを使用する」を選択して「次へ」
  2. 「INSERT」を選択して「次へ」
  3. insert文を入力して「次へ」
  4. 「InsertQuery」という名前を入力して「完了」

これで完成。入力したinsert文は以下のようにした。

insert into Bbs(
    subject,
    name,
    body,
    timestamp
) values (
    @subject,
    @name,
    @body,
    getdate()
)

つまり、SQL文を指定するだけで、そのSQLを発行するメソッドを生成してコードから呼び出せるようになる。SQL中の動的な部分は「@」付きの名前にしておく。そのままメソッドの引数となり、SQLに埋め込まれる。SQLインジェクションの心配も無い。idフィールドは自動で採番されるので、渡さなくて良い。timestampフィールドはシステム日付をそのまま入れる。

画面に入力フォームを追加

画面が現段階では表示専用なので、投稿フォームを追加しなきゃいけない。

<form id="RegisterForm" runat="server">
    <p>
        <label for="SubjectText">タイトル</label>
        <asp:TextBox id="SubjectText" runat="server"></asp:TextBox>
    </p>
    <p>
        <label for="NameText">名前</label>
        <asp:TextBox id="NameText" runat="server"></asp:TextBox>
    </p>
    <p>
        <label for="BodyText">本文</label>
        <asp:TextBox id="BodyText" runat="server" columns="50" rows="10" textmode="MultiLine"></asp:TextBox>
    </p>
    <p>
        <asp:Button id="RegisterButton" runat="server" text="登録"></asp:Button>
    </p>
</form>

こんなhtmlを画面(Default.aspx)に追加した。の上に。

コードビハインドの作成

画面の裏にコードあり。ってことで、Default.aspx.vbに以下のメソッドを追加。

Protected Sub RegisterButton_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles RegisterButton.Click

    Dim da As New DataSetTableAdapters.BbsTableAdapter()
    da.InsertQuery(SubjectText.Text, NameText.Text, BodyText.Text)

End Sub

登録ボタンのクリックイベント。BbsTableAdapterをインスタンス化して、たった今作ったInsertQueryメソッドを呼んでるだけ。引数には画面のテキストボックスのTextプロパティを渡すだけ。

実行

さてF5キーで実行。

ちゃんと投稿フォームが表示されてる。ここに適当なデータを入力して「登録」をクリックしてみる。

登録された。大成功。

とりあえずここまで

表示系と更新系を作ったので、あとはこれを応用すれば大抵のWebアプリは作れると思う。大げさに言ってるわけじゃなく、ホントにそうだと思ってる。

VBのコードは今回2行しか書いてない。前回も4行しか書いてない。従来までは、データベースのデータを画面に表示したり、画面の入力値をデータベースに格納したりする部分は、毎回毎回同じようなコードを書いてきたと思う。Visual Studio 2008では、そういう無駄な作業は自動でやってくれるわけだ。人間にはもっとやらなきゃいけないことがある。UIを洗練させたり、仕様をシンプルにしたり、使う人が少しでも幸せになるために、考えなければいけないことがたくさんある。そういう部分に時間をつぎ込むため、当たり前の作業はツールが自動でやってくれる。

そう考えたとき、まだこの掲示板には足りないところがある。

  • 画面がさみしすぎる
  • ページング機能が無く、全データが1ページに表示されてしまう
  • ソート順が古い順になっている(まあ2chとかはそうだから別にこのままでも良いけど)
  • 本文で改行をしても、表示のときに改行されない
  • 書き込み1件ずつのパーマリンクが無い

この辺をどうにかしたいと思ったとき、Visual Studio 2008だとどんな方法があるのか。引き続き時間を見つけて勉強していきたい。

2005とほとんど同じ

しかしここまで作ってみてよく考えてみると、ほとんどVisual Studio 2005と同じだ。前に仕事で2005でWebサイト作ったとき、まさにこんな感じだった。そのときDBはOracleだったけど。