特集

ASP.NETで実践するO/Rマッピング(NHibernate編)

山田 祥寛(http://www.wings.msn.to/
2005/09/21

Page1 Page2 Page3 Page4

NHibernateによるデータ登録

 次に、NHibernateを使ったデータの登録を行ってみよう。前節の内容を理解できていれば、データの登録は極めて直感的に実現できる。

 以下のサンプル・コードは、ユーザーから入力された値をbooksテーブルに新規登録するためのWebフォームの例だ。

<%@ Page ContentType="text/html" Language="C#" %>
<%@ Import Namespace="NHibernate" %>
<%@ Import Namespace="NHibernate.Cfg" %>
<%@ Import Namespace="Com.Msn.Wings" %>
<script runat="Server">

public void btnSubmit_Click(Object sender, EventArgs e) {

  // NHibernateのセッションを開く

  Configuration config = new Configuration();
  config.AddAssembly("Book");
  ISessionFactory factory = config.BuildSessionFactory();
  ISession sess = factory.OpenSession();

  // トランザクションを開始
  ITransaction trans = sess.BeginTransaction();

  Book book = new Book();
  book.Isbn = txtIsbn.Text;
  book.Title = txtTitle.Text;
  book.Price = Int32.Parse(txtPrice.Text);
  book.Publish = txtPublish.Text;
  book.Published = DateTime.Parse(txtPublished.Text);

  // Bookオブジェクトの内容をデータベースに反映
  sess.Save(book);

  // トランザクションの確定
  trans.Commit();
  sess.Close();
}

</script>
<html>
<head>
<title>NHibernateによるデータ登録</title>
</head>
<body>
<form runat="Server">
  <table border="0">
    <tr>
      <th align="right">ISBNコード:</th>
      <td><asp:TextBox id="txtIsbn"
            runat="Server" Columns="20" /></td>
    </tr>
    <tr>
      <th align="right">書名:</th>
      <td><asp:TextBox id="txtTitle"
            runat="Server" Columns="40" /></td>
    </tr>
    <tr>
      <th align="right">価格:</th>
      <td><asp:TextBox id="txtPrice"
            runat="Server" Columns="5" />円</td>
    </tr>
    <tr>
      <th align="right">出版社:</th>
      <td><asp:TextBox id="txtPublish"
            runat="Server" Columns="15" /></td>
    </tr>
    <tr>
      <th align="right">配本日:</th>
      <td><asp:TextBox id="txtPublished"
            runat="Server" Columns="15" /></td>
    </tr>
    <tr>
      <td colspan="2">
        <asp:Button id="btnSubmit" runat="Server"
          Text="登録" OnClick="btnSubmit_Click" />
      </td>
    </tr>
  </table>
</form>
</body>
</html>
<%@ Page ContentType="text/html" Language="VB" %>
<%@ Import Namespace="NHibernate" %>
<%@ Import Namespace="NHibernate.Cfg" %>
<%@ Import Namespace="Com.Msn.Wings" %>
<script runat="Server">

Public Sub btnSubmit_Click(sender As Object, e As EventArgs)

  ' NHibernateのセッションを開く
  Dim config As New NHibernate.Cfg.Configuration()
  config.AddAssembly("Book")
  Dim factory As ISessionFactory = config.BuildSessionFactory()
  Dim sess As ISession = factory.OpenSession()

  ' トランザクションを開始
  Dim trans As ITransaction = sess.BeginTransaction()
  Dim book As New Book()
  book.Isbn = txtIsbn.Text
  book.Title = txtTitle.Text
  book.Price = Int32.Parse(txtPrice.Text)
  book.Publish = txtPublish.Text
  book.Published = DateTime.Parse(txtPublished.Text)

  ' Bookオブジェクトの内容をデータベースに反映
  sess.Save(book)

  ' トランザクションの確定
  trans.Commit()
  sess.Close()
End Sub

</script>
<html>
<head>
<title>NHibernateによるデータ登録</title>
</head>
<body>
<form runat="Server">
  <table border="0">
    <tr>
      <th align="right">ISBNコード:</th>
      <td><asp:TextBox id="txtIsbn"
            runat="Server" Columns="20" /></td>
    </tr>
    <tr>
      <th align="right">書名:</th>
      <td><asp:TextBox id="txtTitle"
            runat="Server" Columns="40" /></td>
    </tr>
    <tr>
      <th align="right">価格:</th>
      <td><asp:TextBox id="txtPrice"
            runat="Server" Columns="5" />円</td>
    </tr>
    <tr>
      <th align="right">出版社:</th>
      <td><asp:TextBox id="txtPublish"
            runat="Server" Columns="15" /></td>
    </tr>
    <tr>
      <th align="right">配本日:</th>
      <td><asp:TextBox id="txtPublished"
            runat="Server" Columns="15" /></td>
    </tr>
    <tr>
      <td colspan="2">
        <asp:Button id="btnSubmit" runat="Server"
          Text="登録" OnClick="btnSubmit_Click" />
      </td>
    </tr>
  </table>
</form>
</body>
</html>
NHibernateを利用してデータ登録を行うサンプル・プログラム
(上:C#版:「nhibernate_input_cs.aspx」、下:VB.NET版「nhibernate_input_vb.aspx」)

 データの登録(あるいは更新、削除)を行う場合、あらかじめトランザクションを開始しておく必要がある。NHibernateでトランザクションを管理するのは、ITransactionオブジェクトの役割だ。ITransactionオブジェクトは、ISession.BeginTransactionメソッドで生成できる。

 あとは、永続化クラスBookの対応するプロパティに入力値をセットし、ISession.Saveメソッドで、これをデータベースに反映するだけだ。トランザクションのコミットには、ITransaction.Commitメソッドを呼び出せばよい。ちなみに、トランザクションをロールバックする場合には、ITransaction.Rollbackメソッドを使用する。

 検索処理の場合と同様、開発者側はSQLをまったく意識せずにオブジェクトの操作のみでデータの操作が可能になることがお分かりいただけるだろう。

 以上を理解したら、さっそくサンプルを実行してみよう。以下のように入力された書籍情報がデータベースに反映されていれば成功だ。

データ登録サンプル・プログラムの実行例
フォームからの入力値をデータベースに登録する。データベースの反映結果は前節のサンプル・プログラムで確認できる。

 なお、データの更新や削除を行う場合も、ほとんど同じ要領で行うことができる。以下は、booksテーブルの主キーであるisbnフィールドで該当するレコード(Bookクラス)を取得し、その内容を更新/削除するサンプル・コードだ(C#の場合)。

ITransaction trans = sess.BeginTransaction();

Book book = (Book)sess.Load(typeof(Book),"4-7981-0722-0");
book.Title = "Community Server入門";
sess.Update(book);

trans.Commit();
NHibernateでデータの更新を行うサンプル・コード(C#)
 
ITransaction trans = sess.BeginTransaction();

Book book = (Book)sess.Load(typeof(Book), "4-7981-0722-0");
sess.Delete(book);

trans.Commit();
NHibernateでデータの削除を行うサンプル・コード(C#)

 それぞれ実際に実行し、データベースから該当するデータが更新/削除されていることを確認してほしい。

 以上、ASP.NETで実践するO/Rマッピング(NHibernate編)ということで、NHibernateを使ったデータベース・アクセスについて解説してきた。実際のサンプル・プログラムを示すことによって、O/Rマッピングが具体的にどのようなものであるかをご理解いただけたと思う。

 本特集の後編となる次回の「iBATIS.NET編」では、.NET向けのもう1つの代表的なO/Rマッピング・ツールである「iBATIS.NET」を紹介する予定だ。同じO/Rマッピングであっても今回のNHibernateとは少し方式が異なっており、これまた興味深いツールとなっている。ご期待いただきたい。End of Article


 INDEX
  [特集] ASP.NETで実践するO/Rマッピング(NHibernate編)
    1..NETの向けのO/Rマッピング・ツール
    2.NHibernateのインストールと設定手順
    3.NHibernate経由でデータベースを検索する
  4.NHibernateによるデータ登録
 


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 記事ランキング

本日 月間