すぐ使えるADO.NET

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

本の紹介

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

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




【第39号】

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

すぐ使えるADO.NET --> サンプルプログラム満載
                      http://park5.wakwak.com/‾weblab/
======================================================================
           ■■ VB.NETワンポイント:DataRowオブジェクト ■■

引数にDataTableオブジェクト変数を指定して、dataAdapterのFillメソッドを
呼び出すと、DataTableオブジェクトのDataRowオブジェクトに、取得されたレ
コードが格納されます。

  Dim row As DataRow
  Dim tbl As DataTable
  Dim dataAdapter As New OleDbDataAdapter()

        :
  dataAdapter.Fill(tbl)
        :

DataTableオブジェクトのDataColumnオブジェクトが持つ列情報を利用すると、
DataRowオブジェクトを使って、テーブルにレコードを追加することができま
す。DataRowオブジェクトは、DataTableオブジェクトのNewRowメソッドを呼び
出して生成します。

  row = tbl.NewRow

こうして生成されたrowインスタンスは、テーブルのフィールドを持って
いますので、ここに画面からの入力値を保管することができます。たとえば、
上記のtblに社員テーブルのレコードが取得されていれば、テキストボックス
(txtSyainCode)の値を

  row("社員コード") = Me.txtSyainCode.Text

のように、rowオブジェクトに保管できます。もし、社員テーブルにないフィー
ルド名を指定したり、正しい型のデータをセットしないと、例外がスローされ
ます。

このDataRowオブジェクトを利用して、テーブルにレコードを追加します。

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

テーブルに1レコードを追加するために、DataRowオブジェクトを生成する
createDataRowメソッドと、テーブルに1レコードを追加するinsertRecordメ
ソッドをclsDBIOクラスに追加します。今号では、createDataRowメソッドを説
明します。

その前に、テーブルがデータベースに存在するかしないかのチェック部分を、
PrivateメソッドのexistTableとして、clsDBIOクラスに追加します。使い方は、
次のようになります。

    If Me.existTable(parTableName) = False Then
      Throw New myDBIOException("テーブルが存在しません")
    End If

createDataRowメソッドでは、getKeyRecordメソッドを呼び出して、DataRowオ
ブジェクトを作成します。引数には、レコードを追加するテーブル名とキー値
を指定します。キー値は、汎用的に使える値を指定します。キー値のレコード
がテーブルになくても問題はありません。

    Dim dt As DataTable
    dt = Me.getKeyRecord("テーブルの名称", "A")
    Dim dr As DataRow = dt.NewRow

テーブルにレコードを追加するまでの手順は次のようになります。なお、エ
ラーチェックはclsInsertSyainクラスに実装し、行データをPrivate変数に保
存します。insertRecordメソッドの引数にこのclsInsertSyainオブジェクトを
指定します。次号にclsInsertSyainクラスのソースリストを掲載します。

  '***** 登録ボタンを押したときにレコードを追加する *****
  Private Sub btnInsert_Click( _
    ByVal sender As System.Object, ByVal e As System.EventArgs) _
    Handles btnInsert.Click

    Try

      Dim oRow As DataRow
      Dim insertCount As Integer
      Dim oDBIO As New clsDBIO()

      'DataRowオブジェクトの取得
      oRow = oDBIO.createDataRow("社員テーブル")

      'DataRowオブジェクトにフィールド値を保管
      oRow("社員コード") = Me.txtSyainCode.Text
      oRow("社員氏名") = Me.txtSyainSimei.Text
                       :

      'clsInsertSyainのインスタンスを生成してエラーチェック
      'コンストラクタでエラーチェック(エラーがあれば、例外をスロー)
      Dim oSyain As New clsInsertSyain(oRow)

      '1レコードを追加
      insertCount = oDBIO.insertRecord(oSyain)

    Catch oExcept As 独自例外
      '独自例外が発生した時の処理

    Catch oExcept As Exception
      '例外が発生した時の処理

    End Try

  End Sub


--【プログラムソースリスト】------------------------------------------
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/mailMagazine.html

  End Function

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

    Dim retDataRow As DataRow                 'リターン値

    Try

      '★引数チェック
      If parTableName = Nothing Then
        Throw New myDBIOException("引数テーブル名が未設定")
      End If

      'テーブル存在チェック
      If Me.existTable(parTableName) = False Then
        Throw New myDBIOException("テーブルが存在しません")
      End If

      Dim dt As DataTable

      dt = Me.getKeyRecord(parTableName, "9")
      retDataRow = dt.NewRow

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

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

    End Try

    Return retDataRow

  End Function

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

    Dim retBool As Boolean                   'リターン値
    Dim tblName As String
    Dim existFlg As Boolean

    For Each tblName In mTableNameList
      If tblName = parTableName Then
        retBool = True
        Exit For
      End If
    Next tblName

    If Not retBool = True Then
      retBool = False
    End If

    Return retBool

  End Function

End Class

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

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

End Class

----------------------------------------------------------------------
              ■■ 次号予告 第40号(4月24日発行予定) ■■
1. VB.NETワンポイント
2. データベースアクセスクラスの汎用メソッドについて 9
======================================================================
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.