すぐ使えるADO.NET

【Visual BasicによるADO.NETデータベースプログラミング】

本の紹介

バックナンバー【第62号】

ADO.NETの基本的なプログラミングを中心に、すぐ使えるサンプルプログラム満載です。




【第62号】

 第62号(2008.3.25発行)
======================================================================
        ★★ -- VB.NETデータベースプログラミング奮闘記 -- ★★
            (VB 2005 Express & SQL Server 2005 Express)
----------------------------------------------------------------------
いつもご購読ありがとうございます。ADO.NETの基本的なプログラミングを中
心に掲載します。今後ともよろしくお願い申し上げます。

すぐ使えるADO.NET --> http://park5.wakwak.com/‾weblab/
======================================================================
                  ■■ 社員テーブルに追加する 4 ■■

社員コード、社員氏名、カナ名、部署コードを入力して、追加ボタンをクリッ
クすると、入力したデータのエラーチェックをして、エラーが無ければ、社員
テーブルに1レコード追加します。接続文字列は、app.configに登録しておき
ます。

【sampleデータベースの社員テーブル】
----------------------------------------------------------------------
key  列 名   データ型    nullを許容  備 考
----------------------------------------------------------------------
○ 社員コード  nchar(5)       許容しない 英数字のみ
− 社員氏名   nvarchar(20)   許容しない
− 社員カナ   nvarchar(40)   許容しない
− 部署コード  nchar(4)       許容しない
− 更新日時   datetime       許容しない
----------------------------------------------------------------------

【sampleデータベースの部署テーブル】
----------------------------------------------------------------------
key  列 名   データ型    nullを許容  備 考
----------------------------------------------------------------------
○ 部署コード  nchar(4)       許容しない 英数字のみ
− 部署名    nvarchar(20)   許容しない
− 更新日時   datetime       許容しない
----------------------------------------------------------------------

コンボボックスのDropDownStyleプロパティは、DropDownListを選択して、テ
キストボックス部分を入力できないように設定します。
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ 社員テーブル追加                _□×┃
┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃  Label1    TxtShainCode
┃┌―――――┐ ┌―――――┐
┃│社員コード│ │     │
┃└―――――┘ └―――――┘
┃  Label2    TxtShainShimei
┃┌―――――┐ ┌――――――――┐
┃│社員氏名 │ │        │
┃└―――――┘ └――――――――┘
┃  Label3    TxtShainKana
┃┌―――――┐ ┌――――――――――――――┐
┃│社員カナ │ │              │
┃└―――――┘ └――――――――――――――┘
┃  Label4    CboBusho
┃┌―――――┐ ┌――――――――┐
┃│部署コード│ │      │▼│
┃└―――――┘ └――――――――┘
┃ BtnInsert    BtnClear
┃┌――――┐  ┌―――――┐
┃│ 追加 │  │ クリア │
┃└――――┘  └―――――┘
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

Public Class FormInsert59

    '----------<< 追加ボタンクリック処理 >>----------
    Private Sub BtnInsert_Click(ByVal sender As System.Object, _
                                ByVal e As System.EventArgs) _
                                Handles BtnInsert.Click

        Try

            Dim shain As DataRow
            'ClsShainTableIOクラスは59号〜62号参照
            Dim dbIO As New ClsShainTableIO()

            'createDataRowメソッドは60号参照
            shain = dbIO.createDataRow()

            shain("社員コード") = Me.TxtShainCode.Text
            shain("社員氏名") = Me.TxtShainShimei.Text
            shain("社員カナ") = Me.TxtShainKana.Text
            shain("部署コード") = Me.CboBushoMei.SelectedValue

            'InsertRecordメソッドは今号参照
            'ClsInsertShainクラスは61号参照
            dbIO.InsertRecord(New ClsInsertShain(shain))

            'フォーム初期設定
            Me.ClearForm()

        Catch oExcept As myShainCodeException
            '社員コード例外が発生した時の処理
            MessageBox.Show(oExcept.Message, "社員コード入力エラー")
            Me.TxtShainCode.Focus()

        Catch oExcept As myShainSimeiException
            '社員氏名例外が発生した時の処理
            MessageBox.Show(oExcept.Message, "社員氏名入力エラー")
            Me.TxtShainShimei.Focus()

        Catch oExcept As myShainKanaException
            '社員カナ例外が発生した時の処理
            MessageBox.Show(oExcept.Message, "社員カナ入力エラー")
            Me.TxtShainKana.Focus()

        Catch oExcept As myDBIOException
            'DBIO例外が発生した時の処理
            MessageBox.Show(oExcept.Message, "DBIO例外発生")

        Catch oExcept As Exception
            'その他例外が発生した時の処理
            MessageBox.Show(oExcept.ToString, "例外発生")

        End Try

    End Sub

    '以下省略(59号〜61号参照)

End Class
----------------------------------------------------------------------
                    ■■ InsertRecord メソッド ■■

InsertRecordメソッドは、各テーブルアクセスクラスに実装するため、
ClsSampleDBIOクラスに抽象メソッドとして宣言する方法もありますが、すべ
ての継承クラスで実装するのを避けるために、インターフェースを利用して実
装することにします。

まず、次のようにインターフェースのメンバー宣言を追加します。追加する場
所は、ClsSampleDBIO.vbファイルの ClsSampleDBIOクラスの直前が見やすいで
しょう。

  Public Interface IDBIO

      Function InsertRecord(ByVal Shain As ClsInsertShain) As Integer

  End Interface


そして、ClsSampleDBIO クラスを継承したClsShainTableIO クラスに、
InsertRecordメソッドを実装する場合には、次のように、Implementsステート
メントを使って、IDBIOを指定します。

Public Class ClsShainTableIO
    Inherits ClsSampleDBIO
    Implements IDBIO


さらに、InsertRecordメソッドのメンバー宣言に Implementsキーワードを
使って、インターフェイス名.メソッド名(IDBIO.InsertRecord)を指定しま
す。戻り値と引数の型は、Interfaceの定義と一致させる必要がありますが、
メソッド名は自由に付けられます。混乱を避けるため同じ名称が良いでしょう。

    Public Function _
    InsertRecord(ByVal Shain As ClsInsertShain) As Integer _
    Implements IDBIO.InsertRecord


レコード追加処理は、NET Framework 2.0から追加されたTransactionScope ク
ラスのトランザクション処理を使いました。このクラスを利用するためには、
あらかじめ参照設定で、System.Transactions を追加します。

TransactionScopeクラスを利用すれば、例外が発生した場合、自動的にロール
バックされます。したがって、明示的にロールバックメソッドを呼び出す必要
はありません。

トランザクションをコミット(完了)するためには、Completeメソッドを呼び
出します。


--【プログラムソースリスト(ファイル名:ClsShainTableIO.vbに追加)】--
  '*******************************************************************
  ' 機能:社員テーブルに1レコードを追加するメソッド
  ' 引数:ClsInsertShain型:追加する1レコード分のデータ
  ' 返値:integer型:追加したレコード数
  '******1*********2*********3*********4*********5**********6*********
  Public Function _
  InsertRecord(ByVal Shain As ClsInsertShain) As Integer _
  Implements IDBIO.InsertRecord

      Dim retInsertCount As Integer                'リターン値

      Try

        '引数チェック(引数が未設定だったら例外をスロー)
        If Shain Is Nothing Then
            Throw New myDBIOException("引数が未設定")
        End If

        'トランザクション開始
        Using tran As New TransactionScope
          Using con As New SqlConnection
            Using cmd As New SqlCommand

              '接続関連プロパティ設定(SetConnectionは58号参照)
              MyBase.SetConnection(con, cmd)

              '----------< SQL文の生成 >----------
              cmd.CommandText = _
              "INSERT INTO " & _
              "社員テーブル(社員コード, 社員氏名, 社員カナ, " & _
              "部署コード, 更新日時) " & _
              "VALUES(@sCode, @sSimei, @sKana, @sBusho, @kosinDate)"

              'SQL文の引数設定
              cmd.Parameters.Clear()
              cmd.Parameters.Add _
              (New SqlParameter("@sCode", SqlDbType.NChar, 5))
              cmd.Parameters.Add _
              (New SqlParameter("@sSimei", SqlDbType.NVarChar, 20))
              cmd.Parameters.Add _
              (New SqlParameter("@sKana", SqlDbType.NVarChar, 40))
              cmd.Parameters.Add _
              (New SqlParameter("@sBusho", SqlDbType.NChar, 4))
              cmd.Parameters.Add _
              (New SqlParameter("@kosinDate", SqlDbType.DateTime))

              '引数に値を設定
              cmd.Parameters("@sCode").Value = Shain.ShainCode
              cmd.Parameters("@sSimei").Value = Shain.ShainSimei
              cmd.Parameters("@sKana").Value = Shain.ShainKana
              cmd.Parameters("@sBusho").Value = Shain.BushoCode
              cmd.Parameters("@kosinDate").Value = Now()

              'DB接続を開く
              con.Open()

              'データベースの更新を実行
              retInsertCount = cmd.ExecuteNonQuery()

            End Using

          End Using

          '1レコード追加なら正常(通常これしかありえない)
          If retInsertCount = 1 Then
            'トランザクション完了(コミット)
            tran.Complete()

          Else
            '1レコード追加以外なら例外をスロー
            'コミットしなければ、自動的にロールバックされる
            Throw New myDBIOException _
            ("社員テーブル:レコード追加処理が失敗しました。")

          End If

        End Using

      Catch ex As Exception
        '例外が発生したら、例外をスロー
        Throw New Exception("例外発生:" & ex.ToString)

      End Try

      '◆リターン
      Return retInsertCount

  End Function


----------------------------------------------------------------------
これで、レコード追加処理は完成です。次号からは、1レコードを削除処理を
作成していきます。

======================================================================
VB.NET データベースプログラミング奮闘記
発行者:ウェブ実験室(ado.netアットマークライヴドットジェーピーlive.jp)
        http://park5.wakwak.com/‾weblab/
----------------------------------------------------------------------
このメールマガジン(マガジンID: 0000128094)は、
インターネットの本屋さん『まぐまぐ』から配信されています。
  http://www.mag2.com/

【購読中止の方法】購読の中止は次のホームページからお願い致します。
  http://park5.wakwak.com/‾weblab/
  http://www.mag2.com/m/0000128094.htm
----------------------------------------------------------------------
このメールマガジン及び「すぐ使えるADO.NET」ホームページで公開している
ソースプログラム・データの利用により生じた損害等については、発行者は
一切責任を負いません。ソースプログラムの再利用は自由です。著作権は発行
者が所有します。
このメールマガジン及び「すぐ使えるADO.NET」ホームページに掲載されてい
る会社名・製品名等は、各社の登録商標または商標です。
======================================================================

Copyright© すぐ使えるADO.NET. All rights reserved.