すぐ使えるADO.NET

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

本の紹介

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

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




【第24号】

 第24号(2005.4.1発行)
======================================================================
           ★★ VB.NETデータベースプログラミング奮闘記 ★★

----------------------------------------------------------------------
いつもご購読ありがとうございます。ADO.NETの基本的なプログラミングを中
心に掲載しますので、今後ともよろしくお願い申し上げます。

すぐ使えるADO.NET --> サンプルプログラム満載
                      http://park5.wakwak.com/‾weblab/
======================================================================
           ■■ VB.NETワンポイント:正規表現で数値チェック ■■

数値チェックをする場合、テキストボックスの入力値を数値に変換せず、文字
のまま、正規表現を使ってチェックする方法を紹介します。
前号では、入力値がすべて数字か否かをチェックするため、Regexクラスの
IsMatchメソッドを使いました。

なお、正規表現を使用する場合には、
  Imports System.Text.RegularExpressions 名前空間をインポートします。

◆3桁の正整数 ---> ^[1-9][0-9]{2,2}$
3桁の正整数の場合は、先頭文字は1から9なので、[1-9]とします。2文字目と
3文字目は、0から9なので、[0-9][0-9]または、繰り返し記号{n,m}を使って、
[0-9]{2,2}とします。{n,m}は、その直前の文字が、n回以上m回以下で連続し
ていることを表現しています。

3桁数字のみで文字列を構成している場合は、先頭文字位置指定 ^ と、末尾文
字位置指定 $ を前後に追加して、^[1-9][0-9]{2,2}$とします。
[1-9][0-9]{2,2}では、s123、123fh、a587ywなど、3桁の連続する数字を含ん
でいれば、どんな文字列にも合致してしまいます。

◆-1から-99999の負整数 ---> ^[¥-][1-9][0-9]{0,4}$
[¥-]は、- 文字を表しています。¥- の ¥ は、正規表現で使われる特殊文字
^$¥-[]{}などを、文字として使う場合には、先頭に ¥ を付加します。

3文字目以降は、[0-9]{0,4}としていますが、3文字目以降がない場合があるた
め繰り返しを{0,4}としています。

◆0から999の整数 ---> ^[0-9]$  または、^[1-9][0-9]{1,2}$
00、000、0000、00000等は、誤りとします。同様に005や037等のように先頭に
0が付いた場合も誤りとします。

ひとつの正規表現では複雑になる場合には、2つ以上に分割します。
1桁の整数は、^[0-9]$ で表現できます。
2桁または3桁の整数は、^[1-9][0-9]{1,2}$ と表現できます。

Me.TextBox1.Textに入力した文字列が、0から999の整数をチェックする例では、
Trim関数で、事前に前後の空白を除去します。その後、正規表現と一致する文
字列があるかどうかを調べるために、Regexクラスの静的メソッド(オブジェク
トを作成しなくてもよい)IsMatchメソッドを使っています。

  '前後の空白除去
  Me.TextBox1.Text = Trim(Me.TextBox1.Text)

  '0から999の整数チェック
  If Regex.IsMatch(Me.TextBox1.Text, "^[0-9]$") _
    Or Regex.IsMatch(Me.TextBox1.Text, "^[1-9][0-9]{1,2}$") Then
      '---< 正常:指定範囲内 >---
      MessageBox.Show(Me.TextBox1.Text + "が入力されました", "正常")
  Else
      '---< エラー:指定範囲外 >---
      MessageBox.Show("0から999までの整数を入力してください", "エラー")
  End If

正規表現を使うと、様々な文字列のチェックができます。次号も正規表現を
使った文字列のチェックについて調べる予定です。

----------------------------------------------------------------------
               ■■ ADO.NETのトランザクション制御 3 ■■

トランザクション制御を使って、社員テーブルと権限テーブルに登録するプロ
グラムを作成します。使用するテーブル定義とフォームレイアウトは、第22号
を参照してください。

今回は、DBアクセスクラスclsDBIOのトランザクション制御を使った更新処理に
ついて説明します。

◆DBアクセスクラスclsDBIOは、社員登録で使うメンバのみを実装します。

トランザクション制御を使って、社員テーブルと権限テーブルに1レコードを
追加するメソッドは、addSyainKengenです。引数に指定する社員登録クラスの
オブジェクト(インスタンス)には、社員テーブルと権限テーブルに登録する
フィールド値がすべて設定されています。

今回の例で説明すると、トランザクションとは、社員テーブルと権限テーブル
に対する一連のデータ処理すべてを指します。

トランザクション中にデータアクセスエラーが生じた場合には、データベース
内のテーブルの整合性を保つため、それまでのデータ変更をすべてキャンセル、
つまりロールバックする必要があります。エラーが起こらず一連のデータ変更
がすべて完了したら、コミットします。

ADO.NETで明示的にトランザクションを開始するためには、Connectionオブジェ
クトのBeginTransactionメソッドを使います。また、データベースアクセス変
更処理が正常に完了したら、Commitメソッドでトランザクションを終了します。

トランザクションの最中にエラーが起こった場合は、Transactionオブジェクト
のRollbackメソッドを使って、それまでの変更処理をすべてキャンセルし、
データベース内のテーブルデータをすべて変更前の状態に戻します。

それでは、コンストラクタと社員テーブルと権限テーブルに1レコードを追加
するメソッドのソースリストを掲載します。次号に社員登録の全ソースリスト
を掲載します。

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

  '--------------------< メンバ:変数 >--------------------
  'コネクション
  Private mConn As OleDbConnection
  'コマンド
  Private mCommand As OleDbCommand

  '*********************************************************
  ' 機能:コンストラクタ
  ' 引数:なし
  '*********************************************************
  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

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

    End Try

  End Sub

  '*********************************************************
  ' 機能:社員テーブルと権限テーブルに1レコードを追加する
  ' 引数:社員登録クラスのオブジェクト
  ' 戻値:Integer型 正常にレコードが追加された時 ---> 1
  ' 備考:レコードを追加できなかった時は、例外をスロー
  '*********************************************************
  Public Function addSyainKengen(ByVal parSyain As clsSyainToroku) _
  As Integer

    Dim retInt As Integer = 0             'リターン値:追加レコード数
    Dim oTrans As OleDbTransaction

    Try
      '----------<< 1.社員テーブルに1レコードを追加 >>----------
      '***** SQL文の設定 *****
      mCommand.CommandText = _
      "INSERT INTO " & _
      "社員テーブル(社員コード, 社員氏名, 社員カナ, 部門コード, 更新日時) " & _
      "VALUES(@sCode, @sSimei, @sKana, @bumonCode, @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("@bumonCode", OleDbType.Char, 3))
      mCommand.Parameters.Add _
      (New OleDbParameter("@kosinDate", OleDbType.Date))

      '***** 引数に値を設定 *****
      mCommand.Parameters("@sCode").Value = parSyain.p社員コード
      mCommand.Parameters("@sSimei").Value = parSyain.p社員氏名
      mCommand.Parameters("@sKana").Value = parSyain.p社員カナ
      mCommand.Parameters("@bumonCode").Value = parSyain.p部門コード
      mCommand.Parameters("@kosinDate").Value = Now()

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

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

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

      '◆レコード追加に失敗したらロールバックして例外スロー
      If Not retInt = 1 Then
        Throw New clsException _
        ("社員テーブル:レコード追加処理が失敗しました。")
      End If

      '----------<< 2.権限テーブルに1レコードを追加 >>----------
      '***** SQL文の設定 *****
      mCommand.CommandText = _
      "INSERT INTO 権限テーブル(社員コード, パスワード, 更新日時) " & _
      "VALUES(@sCode, @passWord, @kosinDate)"

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

      '***** 引数に値を設定 *****
      mCommand.Parameters("@sCode").Value = parSyain.p社員コード
      mCommand.Parameters("@passWord").Value = parSyain.pパスワード
      mCommand.Parameters("@kosinDate").Value = Now()

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

      '◆レコード追加に失敗したらロールバックして例外スロー
      If Not retInt = 1 Then
        Throw New clsException _
        ("社員テーブル:レコード追加処理が失敗しました。")
      End If

      '***** トランザクション完了 *****
      oTrans.Commit()

    Catch oExcept As clsException
      '◆レコード追加に失敗したらロールバックして例外スロー
      oTrans.Rollback()
      Throw New clsException(oExcept.Message)

    Catch oExcept As Exception
      '◆レコード追加に失敗したらロールバックして例外スロー
      oTrans.Rollback()
      Throw New Exception _
      ("clsTableSyainのaddRecで例外発生" + vbCrLf + 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 retInt

  End Function

----------------------------------------------------------------------
               ■■ 次号予告 第25号(4月25日発行予定) ■■
1. VB.NETワンポイント
2. ADO.NETのトランザクション制御 4(完) 全ソースリストを掲載
======================================================================
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.