■知恵袋の入力フォーム作成 (blogAdd.aspx)

 

智恵袋に新規データを入力するWebフォームを作成します。VS.NET 2003を起動して新規Webフォームを作成したら、[テーブル]メニューから[挿入]-[テーブル]を選択して5x2の表を作成します。1行目を選択したら右クリックから[セルの結合]を選択して結合します。

 

(table)に図7に示すようなコントロールを配置します。1行目には、<h1>…</h1>タグを配置して見出しを表示します。2行目には、「タイトル」を入力するTextBoxを配置します。TextBoxの右側にはRequiredFieldValidatorを配置してタイトルが未入力ときエラーメッセージを表示します。3行目には、「内容」を入力するTextBoxを配置します。このTextBoxには、「Width="600px"」と「Height="250px"」を追加して複数行入力できるようにします。

 

3行目には、TextBoxDropDownListを配置します。DropDownListには、ランタイム時にtblCategoriesテーブルをバインドしてカテゴリーの一覧を表示します。DropDownListAutoPostBackプロパティに「True」を設定してカテゴリーを選択したときにWebページをポストバックさせます。さらに、DataTextFieldDataValueFieldプロパティに「CategoryName」と「CategoryID」を設定します。DropDownListから選択したカテゴリーは左側のTextBoxに表示します。DropDownListから複数のアイテムを選択したときは、セミコロン区切りで表示します。5行目には、[保存]用のButtonを配置します。

 

図7:デザイナに表を作成したらツールボックスから各種コントロールを配置する

 

Page_LoadイベントハンドラではIsPostBackプロパティを参照してWebページが最初にロードされたとき、PopulateCategoriesメソッドを呼び出してDropDownListtblCategoriesテーブルをバインドします。

 

Private Sub Page_Load(・・・) Handles MyBase.Load

  If Not IsPostBack Then

    PopulateCategories(dropCategories)

  End If

End Sub

 

リスト1:DropDownListtblCategoriesテーブルをバインドするメソッド (blogAdd.aspx.vb)

Sub PopulateCategories(ByVal ddl As DropDownList)

  Dim strSQL As String = "SELECT * FROM tblCategories ORDER BY CategoryID"

  Dim strConnectionString As String = ConfigurationSettings.AppSettings("conStringBlog")

  Dim con As New OleDbConnection(strConnectionString)

  Dim cmd As New OleDbCommand(strSQL, con)

  con.Open()

  ddl.DataSource = cmd.ExecuteReader()

  ddl.DataBind()

  con.Close()

  ddl.Items.Insert(0, New ListItem("選択してください!", ""))

End Sub

 

DropDownListからカテゴリーを選択すると、WebページがポストバックされてDropDownListSelectedIndexChangedイベントハンドラが実行されます。このイベントハンドラでは、選択したカテゴリー名(CategoryName)TextBox(txtCategoryNames)に表示します。DropDownListから複数のカテゴリーを選択したときは、セミコロン区切りで表示します。カテゴリーID(CategoryID)は、ViewStateに保存しておきます。

 

リスト2: DropDownListからアイテムを選択したときのイベントハンドラ (blogAdd.aspx.vb)

Private Sub dropCategories_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles dropCategories.SelectedIndexChanged

  Dim strCategoryID As String = dropCategories.SelectedItem.Value

  Dim strCategoryName As String = dropCategories.SelectedItem.Text

  Dim strCategories As String = ViewState("Categories")

  If strCategories Is Nothing Then

    strCategories = strCategoryID

    txtCategoryNames.Text = strCategoryName

  Else

    strCategories &= ";" & strCategoryID

    txtCategoryNames.Text &= ";" & strCategoryName

  End If

  ViewState("Categories") = strCategories

End Sub

 

[保存]ボタンのクリック時のイベントハンドラでは、「タイトル」と「内容」のTextBoxから値を取得してInsertBlogメソッドの引数として渡します。カテゴリーIDは、ViewStateから取得して引数に渡します。

 

Private Sub btnSave_Click(・・・) Handles btnSave.Click

  Dim strTitle As String = txtTitle.Text

  Dim strDescription As String = txtDescription.Text

  Dim strCategories As String = ViewState("Categories")

  InsertBlog(strTitle, strDescription, strCategories)

End Sub

 

InsertBlogメソッドでは、SQLINSERTステートメント(※)を実行してtblBlogテーブルに新規レコードを追加します。tblBlogテーブルのBlogIDフィールドは、オートナンバー型のためAccessが自動採番します。自動採番されたBlogIDを取得するには、INSERTステートメントの直後にSELECT @@IDENTITYステートメントを実行して取得します。

 

Accessの場合SQL Serverと異なり、INSERTステートメントとSELECTステートメントをセミコロンで結合して同時に実行させることができませんので、CommandオブジェクトのExecuteNonQueryメソッドとExecuteScalarメソッドを別々に発行します。

 

 

Accessの場合、名前指定のパラメータ変数をサポートしていないため位置指定の書式(パラメータ変数名の代わりに「?」を使用)で記述する必要があるのですが、ここでは便宜上名前指定の書式で記述しています。この場合、パラメータに値を代入するときパラメータ(「?」のこと)を記述した順番に値を代入する必要があります。

 

位置指定でパラメータを記述した例:

INSERT INTO tblBlog (Title, Description) VALUES(?, ?)

cmd.Parameters.Add("1", strTitle)

cmd.Parameters.Add("2", strDescription)

 

For…Nextステートメントでは、引数strCategoriesからカテゴリーIDを取得してInsertBlogCatLinkメソッドの引数に渡します。InsertBlogCatLinkメソッドは、SQLINSERTステートメントを実行してtblBlogCatLinksテーブルにリンク用のレコードを追加します。

 

リスト3: tblBlogテーブルに新規レコードを追加するメソッド (blogAdd.aspx.vb)

Function InsertBlog(ByVal strTitle As String, ByVal strDescription As String, ByVal strCategories As String) As Integer

  Dim strSQL As String = "INSERT INTO tblBlog (Title, Description) VALUES(@Title, @Description)"

  Dim strConnectionString As String = ConfigurationSettings.AppSettings("conStringBlog")

  Dim con As New OleDbConnection(strConnectionString)

  Dim cmd As New OleDbCommand(strSQL, con)

  cmd.Parameters.Add("@Title", strTitle)

  cmd.Parameters.Add("@Description", strDescription)

  con.Open()

  Dim intAffectedRecords As Integer = cmd.ExecuteNonQuery

  cmd.CommandText = "SELECT @@IDENTITY"

  Dim intBlogID As Integer = Int32.Parse(cmd.ExecuteScalar)

  con.Close()

  Dim arrCategories() As String = strCategories.Split(";")

  For i As Integer = 0 To arrCategories.Length - 1

    InsertBlogCatLink(intBlogID, Int32.Parse(arrCategories(i)))

  Next

  Return intAffectedRecords

End Function

 

 

リスト4: tblBlogCatLinksテーブルにリンクレコードを追加するメソッド (blogAdd.aspx.vb)

Function InsertBlogCatLink(ByVal intBlogID As Integer, ByVal intCategoryID As Integer) As Integer

  Dim strSQL As String = "INSERT INTO tblBlogCatLinks (BlogID, CategoryID) VALUES(@BlogID, @CategoryID)"

  Dim strConnectionString As String = ConfigurationSettings.AppSettings("conStringBlog")

  Dim con As New OleDbConnection(strConnectionString)

  Dim cmd As New OleDbCommand(strSQL, con)

  cmd.Parameters.Add("@BlogID", intBlogID)

  cmd.Parameters.Add("@CategoryID", intCategoryID)

  con.Open()

  Dim intAffectedRecords As Integer = cmd.ExecuteNonQuery

  con.Close()

  Return intAffectedRecords

End Function

 

 

8 智恵袋の入力フォームから新規データを入力したところ