すぐ使えるADO.NET

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

本の紹介

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

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




【第45号】

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

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

ConnectionStringプロパティに、構成ファイルに設定した接続文字列を指定し
て、データベースに接続することもできます。

構成ファイルのファイル名は、アプリケーション名.exe.configになります。
また、構成ファイルは、拡張子exeのあるフォルダにコピーされます。前号の
udlファイルとは異なり、ファイルの内容は自動生成されません。中身は、
xml形式で記述する必要があります。

プロジェクトの新しい項目の追加で、アプリケーション構成ファイルを選んで、
新規にファイルを追加すると、次のひな型が自動生成された構成ファイルが作
られます。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
</configuration>

生成された<configuration>と</configuration>の間に、<appSettings>要素を
追加します。さらに、<appSettings>要素の中に<add>要素を追加して、key属
性にキー値を、value属性にキー値に対応する値を、文字列として記述します。
たとえば、次のような記述になります。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="OleCon"
       value="Provider=Microsoft.Jet.OLEDB.4.0;Data
         Source=D:¥xxxxx¥bin¥sample.mdb;Persist Security Info=False" />
   </appSettings>
</configuration>

構成ファイルの設定値の読込むためには、AppSettingsReaderクラスの
GetValueメソッドを使用します。

【コーディング例】

  Dim con As OleDbConnection

    Try
      con = New OleDbConnection()

      Dim setRead As New Configuration.AppSettingsReader()

      'DB接続文字列の設定
      con.ConnectionString = _
      CType(setRead.GetValue("OleCon", GetType(System.String)), String)

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

    Catch oExcept As OleDbException
      Throw New Exception("例外発生" + oExcept.ToString)

    Catch oExcept As Exception
      Throw New Exception("例外発生" + oExcept.ToString)


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

    End Try

  End Sub


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

今号は、社員テーブルのレコードを削除するdeleteRecordメソッドを、
clsDBIOクラスに追加します。引数には、clsDeleteSyainクラスのオブジェク
トを指定します。

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

◆引数のNothing(未設定)チェック
引数が未設定の場合、myDBIOException例外をスローします。

◆SQL文の構築
更新日時が他で変更されていた場合には、削除できないように、WHERE句で、
"AND 更新日時=@updateDate" の条件を追加しています。@updateDateは、読み
込んだ時の更新日時をセットします。他で変更されていれば、更新日時が一致
しないため、レコードが見つかりません。また、削除されている場合も、見つ
かりません。

DELETE FROM 社員テーブル WHERE 社員コード=@sCode AND 更新日時=@updateDate


◆削除処理
トランザクション制御は、レコード追加や更新とまったく同様です。削除する
レコードが1レコードでなかった場合には、ロールバックして、削除前の状態
に戻します。WHERE句の条件を複雑にして、複数レコードを削除しないように
注意してください。

削除されたレコード数は、ExecuteNonQueryメソッドの戻り値でわかります。
この戻り値が1以外は、レコード削除の失敗となります。

削除するレコードが1レコードならば、Commitメソッドでトランザクションを
完了します。削除するレコードが1レコードでなかった場合には、
TransactionオブジェクトのRollbackメソッドを使って、それまでの削除処理
をすべてキャンセルして、データベース内のテーブルデータをすべて削除前の
状態に戻します。

'----------------- << データベースアクセスクラス >> -----------------
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

  '****************************************************************************
  ' 機能:社員テーブルの1レコードを削除するメソッド
  ' 引数:clsUpdateSyain型:削除する1レコード分のデータ
  ' 戻値:integer型:削除したレコード数
  '****************************************************************************
  Public Function deleteRecord(ByVal parSyain As clsDeleteSyain) As Integer

    Dim retDeleteCount 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 = _
      "DELETE FROM 社員テーブル " + _
      "WHERE 社員コード=@sCode AND 更新日時=@updateDate"

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

      '***** 引数に値を設定 *****
      mCommand.Parameters("@sCode").Value = parSyain.pSyainCode
      mCommand.Parameters("@updateDate").Value = parSyain.pUpdateTime

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

      '***** トランザクション開始 *****
      Dim oTrans As OleDbTransaction
      oTrans = mConn.BeginTransaction
      mCommand.Transaction = oTrans

      '***** データベースの削除を実行  *****
      retDeleteCount = mCommand.ExecuteNonQuery()

      If retDeleteCount = 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のdeleteRecordで例外発生" + 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 retDeleteCount

  End Function

  '*******************************************************************
  ' 機能:キー値のレコードの有無を調べるメソッド
  ' 引数:テーブル名、キー値
  ' 戻値:ある-->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

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

  End Function

  '****************************************************************************
  ' 機能:社員テーブルの1レコードを更新するメソッド
  ' 引数:clsUpdateSyain型:更新する1レコード分のデータ
  ' 戻値:integer型:更新したレコード数
  '****************************************************************************
  Public Function updateRecord(ByVal parSyain As clsUpdateSyain) As Integer

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

  End Function

End Class

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