すぐ使えるADO.NET

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

本の紹介

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

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




【第32号】

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

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

OleDbConnectionオブジェクトのGetOleDbSchemaTableメソッドを使って、DBの
テーブル名やキーフィールド名を取得することができます。

◆テーブル名の取得
引数に、グローバル一意識別子であるOleDbSchemaGuid.Tablesとオブジェクト
配列のTABLE_CATALOG、TABLE_SCHEMA、TABLE_NAME、TABLE_TYPEを指定します。
オブジェクト配列の指定で、取得したいスキーマ値を制御することができます。
指定が不要の場合には、Nothingを設定します。MDBのテーブル名を取得する場
合には,TABLE_TYPEに"TABLE"を設定すれば、テーブル名が戻り値(Datatable型)
に格納されます。OleDbConnectionオブジェクトをconとすると、次のような
コーディングになります。

  Dim schemaTable As DataTable
  schemaTable = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, _
                New Object() {Nothing, Nothing, Nothing, "TABLE"})

◆テーブルのキーフィールド名の取得
引数に、グローバル一意識別子であるOleDbSchemaGuid.Indexesとオブジェク
ト配列のTABLE_CATALOG、TABLE_SCHEMA、TABLE_NAMEを指定します。テーブル
のキーフィールド名を取得する場合には、TABLE_NAMEにテーブル名を設定しま
す。

  schemaTable = con.GetOleDbSchemaTable(OleDbSchemaGuid.Primary_Keys, _
                New Object() {Nothing, Nothing, "社員テーブル"})

この2つのメソッドは、データベースアクセスクラスの中で利用します。実践
的なコーディングは、プログラムソースリストを参考にしてください。

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

今回から何回かに分けて、DBアクセスクラスの汎用的なメソッドについて、作
成していきます。

最初に、クラス内部で使用するPrivateなメンバ変数として、コネクションオ
ブジェクト、コマンドオブジェクト、テーブル名を保持するコレクションオブ
ジェクトを宣言します。

次に、コンストラクタを作成します。MDBは、プロジェクトファイルホルダの
下にあるbinホルダに置く前提で、コンストラクタでコーディングしています
が、コネクションストリングを引数とするコンストラクタを追加したりして、
実情に合わせて修正してください。

コンストラクタでは、DBのテーブルの名称を取得して、メンバ変数のテーブル
名コレクションに保存します。以後必要に応じて、各メソッドでは、テーブル
名コレクションの値を参照するようにします。

  'テーブル名を取得
  schemaTable = mConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, _
                New Object() {Nothing, Nothing, Nothing, "TABLE"})
  Dim i As Integer
  For i = 0 To schemaTable.Rows.Count - 1
    mTableNameList.Add(schemaTable.Rows(i)("TABLE_NAME").ToString)
  Next i

最初に、社員テーブルのキー値レコードの存在をチェックするメソッド
existKeySyainをひとつ作ります。次回にこのメソッドを修正して、汎用的に
呼び出せるキー値レコードの存在をチェックするメソッドに作り直します。

メソッドを呼び出すときには、引数にテーブル名やキーフィールド名があれば、
必ずこれらのエラーチェックをします。また、キー値等も必ずチェックします。
ただし、キー値は英数字及び"-"と"_"で構成されている前提で、エラーチェッ
クしています。

このメソッドでは、キー値のレコード数を調べるために、Commandオブジェクト
のExecuteScalarメソッドを使います。戻り値にセットされたレコード数を調べ
て、1であればTrueを、そうでなければFalseを戻り値にセットします。

なお、コネクションオブジェクトのOpenメソッドと、Closeメソッドは、必要
に応じて、必ず実行するようにしてください。

エラーチェック用に、myDBIOExceptionクラスを追加します。エラー発生時に、
エラーメッセージをセットして、myDBIOException例外をThrowします。

  Throw New myDBIOException("エラー:キー値不正")

Catch側では、myDBIOExceptionとExceptionを分けて受け取れるようにして、
再度呼び出し元に例外をThrowしています。

  Catch oExcept As myDBIOException
    Throw New myDBIOException("エラー発生" + oExcept.Message)

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

今回は、コンストラクタ、existKeySyainメソッド、独自例外クラスのソース
リストを掲載します。

--【プログラムソースリスト】------------------------------------------
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()

  '*******************************************************************
  ' 機能:コンストラクタ
  ' 引数:なし
  '*******************************************************************
  Public Sub New()

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

      'コネクションオブジェクトの設定
      mCommand = New OleDbCommand()
      mCommand.Connection = mConn

      '********** << テーブル名を取得 >> **********
      Dim schemaTable As DataTable

      mConn.Open()

      schemaTable = mConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, _
                    New Object() {Nothing, Nothing, Nothing, "TABLE"})

      'メンバmTableNameListにテーブル名をセット
      Dim i As Integer
      For i = 0 To schemaTable.Rows.Count - 1
        mTableNameList.Add(schemaTable.Rows(i)("TABLE_NAME").ToString)
      Next i

      mConn.Close()

    Catch oExcept As Exception
      Throw New Exception _
      ("clsDBIOのコンストラクタで例外発生" + oExcept.ToString)

    End Try

  End Sub

  '******************************************************************
  ' 機能:社員テーブルのキー値のレコードの有無を調べるメソッド
  ' 引数:キー値
  ' 戻値:ある-->True、ない-->False
  '******************************************************************
  Public Function existKeySyain(ByVal parKey As String) As Boolean

    Dim retBool As Boolean                      'リターン値

    Try

      'キー値チェック(注:キー値は英数字と_と-で構成されている場合)
      If Not Regex.IsMatch(parKey, "^[0-9a-zA-Z_¥-]+$") Then
        '数字以外はエラー
        Throw New myDBIOException("エラー:キー値不正")
      End If

      'SQL文設定
      mCommand.CommandText = _
      "SELECT COUNT(*) FROM 社員テーブル WHERE 社員コード = @Key"

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

      '----------< コマンドパラメータに値を設定 >----------
      mCommand.Parameters("@key").Value = parKey   'キー値の設定

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

      'レコード件数取得
      Dim Count As Integer = CInt(mCommand.ExecuteScalar())

      '----------< 戻値を設定 >----------
      If Count = 1 Then
          retBool = True
      Else
          retBool = False
      End If

    Catch oExcept As myDBIOException
        Throw New myDBIOException("エラー発生" + oExcept.Message)

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

  End Function

End Class

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

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

End Class

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