すぐ使えるADO.NET

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

本の紹介

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

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




【第37号】

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

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

前回は、Stateプロパティを紹介しましたが、今回は他のコネクションオブ
ジェクトのプロパティを紹介します。

◆ServerVersionプロパティ
使用するデータベースのバージョンが、99.99.9999の書式の文字列で返されま
す。1番目の2桁がメジャーバージョン、2番目の2桁がマイナーバージョン、
3番目の4桁がリリースバージョンとなります。 ServerVersionがサポートさ
れていない場合には、空文字列が返されます。

◆ConnectionTimeoutプロパティ
接続が開かれるまでの待機時間(秒数)を取得することができます。既定値は
15秒になっています。

◆Providerプロパティ
接続文字列で指定したProvider句のプロバイダ名を取得できます。次の例では、
"Microsoft.Jet.OLEDB.4.0"になります。

  'コネクション
  Dim mConn As OleDbConnection

  Try
      'DB接続文字列の設定
      mConn = New OleDbConnection()
      mConn.ConnectionString = _
      "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" _
      & Application.StartupPath & "¥sample.mdb"

      mConn.Open()

      'DBMSバージョンを表示
      MessageBox.Show(mConn.ServerVersion, "DBMSバージョン")

      '待機時間を表示
      MessageBox.Show(mConn.ConnectionTimeout.ToString, "待機時間")

      'Provider句を表示
      MessageBox.Show(mConn.Provider, "Provider句")

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

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

  End Try

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

今回は、引数に指定したテーブルの全レコードを取得する汎用的なメソッド
getAllRecordsを作成します。ただし、レコード数の多いテーブルの呼び出し
には、注意してください。タイムアウトの設定などは既定値をそのまま使って
います。

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

◆テーブル名チェック
引数のテーブル名がmTableNameListになければ、エラーとして、
myDBIOException例外をスローします。

◆SQL文の構築
引数のテーブル名を、SQL文に連結します。
  mCommand.CommandText = "SELECT * FROM " + parTableName

◆レコードの取得
データアダプタのFillメソッドを呼び出します。DataTable型の戻りオブジェ
クトの中に取得したレコードが格納されます。このオブジェクトをリターン
値にセットします。

次号では、テーブルのキー値の指定範囲のレコードを取得する汎用的なメソッ
ドgetRecordsOfRangeOfKeyをclsDBIOクラスに追加します。このメソッドで
SELECT系を完了にします。後は必要に応じて追加していくことにします。

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

  End Function

  '*******************************************************************
  ' 機能:テーブルの全レコードを取得するメソッド
  ' 引数:String型:テーブル名
  ' 戻値:DataTable型:取得したレコード
  ' 備考:キー値は英数字のみで構成されている
  '*******************************************************************
  Public Function getAllRecords(ByVal parTableName As String) As DataTable

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

    Try

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

      'テーブル名チェック
      Dim tblName As String
      Dim existFlg As Boolean

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

      If Not existFlg = True Then
        Throw New myDBIOException("テーブル名不正")
      End If

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

      mCommand.Parameters.Clear()

      'SQL文設定
      mCommand.CommandText = "SELECT * FROM " + parTableName

      'テーブルからレコード取得
      Dim dataAdapter As New OleDbDataAdapter()

      dataAdapter.SelectCommand = mCommand
      dataAdapter.Fill(retDataTable)

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

    Catch oExcept As Exception
      Throw New Exception _
      ("clsDBIOのgetAllRecordsで例外発生" + 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 retDataTable

  End Function

End Class

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

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

End Class

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