すぐ使えるADO.NET

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

本の紹介

バックナンバー:VB.NETデータベースプログラミング

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




【第41号】

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

すぐ使えるADO.NET --> サンプルプログラム満載
                      http://park5.wakwak.com/‾weblab/
======================================================================
             ■■ VB.NETワンポイント:宣言の訂正 ■■

clsDBIOクラスのinsertRecordメソッド内で、

  mCommand.Parameters("@sCode").Value = parSyain.pSyainCode
  mCommand.Parameters("@sSimei").Value = parSyain.pSyainSimei
  mCommand.Parameters("@sKana").Value = parSyain.pSyainKana

のように使用するために、clsInsertSyainクラスに定義した、pSyainCodeプロ
パティ、pSyainSimeiプロパティ、pSyainKanaプロパティを、Private宣言から
Public宣言に変更します。

----- 訂正内容 -------------------------------------------------------

【変更前】Private Property pSyainCode() As String
【変更後】Public Property pSyainCode() As String

【変更前】Private Property pSyainSimei() As String
【変更後】Public Property pSyainSimei() As String

【変更前】Private Property pSyainKana() As String
【変更後】Public Property pSyainKana() As String

恐れ入りますが、宣言の修正よろしくお願いします。

----------------------------------------------------------------------
     ■■ データベースアクセスクラスの汎用メソッドについて 10 ■■

社員テーブルに1レコードを追加するinsertRecordメソッドを、clsDBIOクラ
スに追加します。

社員テーブル以外のレコード追加メソッドも、insertRecordと同一の名称にし、
それぞれのテーブル用の引数を用意して区別します。

今回は、トランザクション制御を使って、社員テーブルにレコードを追加しま
す。ADO.NETで明示的にトランザクションを開始するためには、Connectionオ
ブジェクトのBeginTransactionメソッドを使います。

  Dim oTrans As OleDbTransaction
  oTrans = mConn.BeginTransaction
  mCommand.Transaction = oTrans

追加されたレコード数は、レコードを追加するために実行するコマンドオブ
ジェクトのExecuteNonQueryメソッドの戻り値です。この戻り値が1以外は、
レコード追加の失敗となります。

  retInsertCount = mCommand.ExecuteNonQuery()

追加するレコードが1レコードならば、Commitメソッドでトランザクションを
完了します。

  oTrans.Commit()

追加するレコードが1レコードでなかった場合には、Transactionオブジェクト
のRollbackメソッドを使って、それまでの変更処理をすべてキャンセルして、
データベース内のテーブルデータをすべて変更前の状態に戻します。

  oTrans.Rollback()

なお、社員テーブルには、社員コード・社員氏名・社員カナ・更新日時を追加
することを前提に各クラスを作成していますので、実情に合わせて拡張するよ
うにしてください。


--【プログラムソースリスト】------------------------------------------
Option Explicit On

Imports System.Data.OleDb
Imports System.Text.RegularExpressions

'----------------- << データベースアクセスクラス >> -----------------
Public Class clsDBIO

  '--------------------< メンバ:変数 >--------------------
  'コネクション
  Private mConn As OleDbConnection
  'コマンド
  Private mCommand As OleDbCommand
  'テーブル名コレクション
  Private mTableNameList As New Collection()

  '*******************************************************************
  ' 機能:コンストラクタ
  ' 引数:なし
  ' 履歴:2005.12.16 追加したFinallyブロックにmConn.Close()を移動
  '*******************************************************************
  Public Sub New()

    '第35号を参照願います。
    'http://park5.wakwak.com/‾weblab/mag035.html

  End Sub

  '*******************************************************************
  ' 機能:キー値のレコードの有無を調べるメソッド
  ' 引数:テーブル名、キー値
  ' 戻値:ある-->True、ない-->False
  ' 備考:キー値は英数字 "_" "-" で構成されていること
  '*******************************************************************
  Public Function existKeyRecord( _
    ByVal parTableName As String, ByVal parKeyValue As String) As Boolean

    '第33号を参照願います。
    'http://park5.wakwak.com/‾weblab/mag033.html

  End Function

  '*******************************************************************
  ' 機能:複数キー値のレコードの有無を調べるメソッド
  ' 引数:テーブル名、キーフィールド名配列、キー値配列
  ' 戻値:ある-->True、ない-->False
  ' 備考:キー値は英数字 "_" "-" で構成されていること
  '*******************************************************************
  Public Function existKeyRecord(ByVal parTableName As String, _
                                 ByVal parKeyfield() As String, _
                                 ByVal parKeyValue() As String) As Boolean

    '第34号を参照願います。
    'http://park5.wakwak.com/‾weblab/mag034.html

  End Function

  '*******************************************************************
  ' 機能:引数にテーブルと主キー値を指定してレコードを取得するメソッド
  ' 引数:String型 テーブル名
  ' 引数:String型 主キー値
  ' 戻値:DataTable型 取得したレコード
  ' 備考:キー値は英数字 "_" "-" で構成されていること
  '*******************************************************************
  Public Function getKeyRecord(ByVal parTableName As String, _
                               ByVal parKeyValue As String) As DataTable

    '第35号を参照願います。
    'http://park5.wakwak.com/‾weblab/mag035.html

  End Function

  '*******************************************************************
  ' 機能:複数キー値のレコードを取得するメソッド
  ' 引数:String型:テーブル名
  ' 引数:String型:主キーフィールド名配列
  ' 引数:String型:主キーフィールドに対応するキー値配列
  ' 戻値:DataTable型:取得したレコード情報
  ' 備考:キー値は英数字 "_" "-" で構成されていること
  '*******************************************************************
  Public Function getKeyRecord(ByVal parTableName As String, _
                               ByVal parKeyfields() As String, _
                               ByVal parKeyValues() As String) As DataTable

    '第36号を参照願います。
    'http://park5.wakwak.com/‾weblab/mag036.html

  End Function

  '*******************************************************************
  ' 機能:テーブルの全レコードを取得するメソッド
  ' 引数:String型:テーブル名
  ' 戻値:DataTable型:取得したレコード
  '*******************************************************************
  Public Function getAllRecords(ByVal parTableName As String) As DataTable

    '第37号を参照願います。
    'http://park5.wakwak.com/‾weblab/mag037.html

  End Function

  '*******************************************************************
  ' 機能:引数に指定した主キー値の範囲のレコードを取得するメソッド
  ' 引数:String型-->テーブル名
  ' 引数:String型-->主キーの最少値
  ' 引数:String型-->主キーの最大値
  ' 引数:String型-->主キーフィールド名(指定しない場合は、既定値の空文字列)
  ' 戻値:DataTable型:取得したレコード
  ' 備考:キー値は英数字 "_" "-" で構成されていること
  '*******************************************************************
  Public Function getRecordsOfRangeOfKey( _
                        ByVal parTableName As String, _
                        ByVal parMinValueOfKey As String, _
                        ByVal parMaxValueOfKey As String, _
                        Optional ByVal parKeyfield As String = "") _
                        As DataTable

    '第38号を参照願います。
    'http://park5.wakwak.com/‾weblab/mag038.html

  End Function

  '*******************************************************************
  ' 機能:テーブル対応の1行を生成するメソッド
  ' 引数:String型:テーブル名
  ' 戻値:DataRow型:生成した行
  '*******************************************************************
  Public Function createDataRow(ByVal parTableName As String) As DataRow

    '第39号を参照願います。
    'http://park5.wakwak.com/‾weblab/mag039.html

  End Function

  '*******************************************************************
  ' 機能:テーブル名をチェックするメソッド
  ' 引数:String型:テーブル名
  ' 戻値:Boolean型:引数のテーブル名が正しい時True、誤っている時False
  '*******************************************************************
  Private Function existTable(ByVal parTableName As String) As Boolean

    '第39号を参照願います。
    'http://park5.wakwak.com/‾weblab/mag039.html

  End Function

  '*******************************************************************
  ' 機能:テーブルに1レコードを追加するメソッド
  ' 引数:clsInsertSyain型:追加する1レコード分のデータ
  ' 戻値:integer型:追加したレコード数
  '*******************************************************************
  Public Function insertRecord(ByVal parSyain As clsInsertSyain) As Integer

    Dim retInsertCount As Integer                'リターン値
    Dim keyList As New Collection()
    Dim i As Integer

    Try

      '★引数チェック
      If parSyain Is Nothing Then
        Throw New myDBIOException("引数が未設定")
      End If

      '----------<< 1.社員テーブルに1レコードを追加 >>----------
      '***** SQL文の設定 *****
      mCommand.CommandText = _
      "INSERT INTO " & _
      "社員テーブル(社員コード, 社員氏名, 社員カナ, 更新日時) " & _
      "VALUES(@sCode, @sSimei, @sKana, @kosinDate)"

      '***** SQL文の引数設定 *****
      mCommand.Parameters.Clear()
      mCommand.Parameters.Add _
      (New OleDbParameter("@sCode", OleDbType.Char, 5))
      mCommand.Parameters.Add _
      (New OleDbParameter("@sSimei", OleDbType.Char, 20))
      mCommand.Parameters.Add _
      (New OleDbParameter("@sKana", OleDbType.Char, 40))
      mCommand.Parameters.Add _
      (New OleDbParameter("@kosinDate", OleDbType.Date))

      '***** 引数に値を設定 *****
      mCommand.Parameters("@sCode").Value = parSyain.pSyainCode
      mCommand.Parameters("@sSimei").Value = parSyain.pSyainSimei
      mCommand.Parameters("@sKana").Value = parSyain.pSyainKana
      mCommand.Parameters("@kosinDate").Value = Now()

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

      '***** トランザクション開始 *****
      Dim oTrans As OleDbTransaction

      oTrans = mConn.BeginTransaction
      mCommand.Transaction = oTrans

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

      If retInsertCount = 1 Then
        '***** トランザクション完了 *****
        oTrans.Commit()
      Else
        '◆レコード追加に失敗したらロールバックして例外スロー
        oTrans.Rollback()
        Throw New myDBIOException _
        ("社員テーブル:レコード追加処理が失敗しました。")
      End If

    Catch oExcept As myDBIOException
      Throw New myDBIOException(oExcept.Message)

    Catch oExcept As Exception
      Throw New Exception _
      ("clsDBIOのinsertRecordで例外発生" + oExcept.ToString)

    Finally
      'DB接続を閉じる
      If Not mConn Is Nothing Then
        If mConn.State = ConnectionState.Open Then
          mConn.Close()
        End If
      End If

    End Try

    '◆リターン
    Return retInsertCount

  End Function

End Class

'--------------- << 独自エラーメッセージ用例外クラス >> --------------
Public Class myDBIOException
  Inherits ApplicationException

  Public Sub New(ByVal errorMessage As String)
    MyBase.New(errorMessage)
  End Sub

End Class

----------------------------------------------------------------------
              ■■ 次号予告 第42号(6月12日発行予定) ■■
1. VB.NETワンポイント
2. データベースアクセスクラスの汎用メソッドについて 11
======================================================================
VB.NET データベースプログラミング奮闘記
  発行者:ウェブ実験室(-----@-----)
          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.