すぐ使えるADO.NET

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

本の紹介

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

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




【第42号】

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

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

DBMSによっては、SQLの"SELECT"文に、FOR UPDATEを使用することができます。
FOR UPDATEを使えば、トランザクションが完了するまで、排他ロックをかける
ことができ、更新処理を確実に実行することが可能です。トランザクションが
完了するまで、他からのアクセスできないので、処理時間が長い場合の使用に
は注意してください。

また、レコードがユニークに選択されるように、WHERE句を指定して、確実に
1レコードが選択されるように、SQL文を記述することも大切です。

残念ながら、MDBでは、FOR UPDATE を使うとエラーになりました。

【SQL文記述例】
key フィールド名
----------------
● 社員コード
  社員氏名
  社員カナ
  更新日時

SELECT * FROM 社員テーブル WHERE 社員コード = "00001" AND
更新日時 = 読込時の値 FOR UPDATE

【コーディング例】
  Try
    'DB接続を開く

    '***** トランザクション開始 *****

    'SELECT … FOR UPDATEでレコード検索
    '(トランザクション完了まで排他制御)

    'テーブルの更新処理

    '***** トランザクション完了 *****

  Catch
    '例外処理

  Finally
    'DB接続を閉じる

  End Try


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

今号からテーブルレコード更新処理に移ります。レコード追加処理と同様に
clsUpdateSyainクラスをプロジェクトに追加します。clsUpdateSyainクラスは、
レコード更新処理時のエラーチェックをする専用クラスとして実装します。

DataRowオブジェクトをコンストラクタの引数に指定して、clsUpdateSyainク
ラスのインスタンスを生成します。

コンストラクタでは、各入力データをSetプロパティを使って、Private変数に
格納します。Setプロパティに、エラーチェックをコーディングし、エラーが
あれば、入力項目に対応する独自の例外をスローします。

-----【エラーチェック内容】-----
●社員コード
社員テーブルにレコードがあれば正常。なければエラー

●社員氏名
入力必須。未入力ならエラー

●社員カナ
1.入力任意。未入力でも正常
2.入力時は、全角カタカナなら正常。全角カタカナ以外があればエラー

●更新日時
エラーチェックなし。
必要に応じて実装してください。今回はユーザが変更することが無いので、
エラー処理はありません。データ取得時の更新日時をそのままセットします。
この更新日時は、更新用のSQL文で、キー値と取得時の更新日時に一致するレ
コードのみ更新するために必要です。もしこのレコードが見つからなければ、
他で更新されたことがわかります。

●Setプロパティを呼び出す前に、各項目のDBNull値のチェック
DataRowオブジェクトには、他のどんな値とも異なるDBNull値が格納されます。
そのため、値を代入しないとDBNull値のままになり、例外が発生します。念の
ため、コンストラクタの中で、IsDBNull関数を呼び出して、エラーチェックを
します。


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

Imports System.Text.RegularExpressions

Public Class clsUpdateSyain

  Private mSyainCode As String
  Private mSyainSimei As String
  Private mSyainKana As String
  Private mUpdateTime As Date

  '----------------------------------------------------------------------
  ' 機能:コンストラクタ
  ' 引数:in 社員1レコード分のデータ
  '----------------------------------------------------------------------
  Sub New(ByVal parSyain As DataRow)

    MyBase.New()

    '【社員コードセット】
    If IsDBNull(parSyain("社員コード")) Then
      Throw New Exception("clsUpdateSyain.New引数例外:社員コード未設定")
    Else
      pSyainCode = CStr(parSyain("社員コード"))
    End If

    '【社員氏名セット】
    If DBNull.Value Is parSyain("社員氏名") Then
      Throw New Exception("clsUpdateSyain.New引数例外:社員氏名未設定")
    End If
    If IsDBNull(parSyain("社員氏名")) Then
      Throw New Exception("clsUpdateSyain.New引数例外:社員氏名未設定")
    Else
      pSyainSimei = CStr(parSyain("社員氏名"))
    End If

    '【社員カナセット】
    If IsDBNull(parSyain("社員カナ")) Then
      Throw New Exception("clsUpdateSyain.New引数例外:社員カナ未設定")
    Else
      pSyainKana = CStr(parSyain("社員カナ"))
    End If

    '【更新日時セット】
    If IsDBNull(parSyain("更新日時")) Then
      Throw New Exception("clsUpdateSyain.New引数例外:更新日時未設定")
    Else
      pUpdateTime = CDate(parSyain("更新日時"))
    End If

  End Sub

  '-------------------- プロパティ:社員コード --------------------
  Public Property pSyainCode() As String

    'Getプロパティ
    Get
      Return Me.mSyainCode
    End Get

    'Setプロパティ
    Set(ByVal Value As String)

      '未入力はエラー
      If Value = "" Then
        Throw New mySyainCodeException("社員コード未入力")
      Else
        '数字以外はエラー
        If Not Regex.IsMatch(Value, "^[0-9]+$") Then
          Throw New _
          mySyainCodeException("社員コードに数字以外あり")
        Else
          '社員テーブルアクセスオブジェクト
          Dim oDBIO As New clsDBIO()

          '社員マスタにこの社員コードがなければエラー
          If oDBIO.existKeyRecord("社員テーブル", Value) = False Then
            Throw New mySyainCodeException("社員コード未登録")
          Else
            Me.mSyainCode = Value
          End If
        End If
      End If

    End Set

  End Property

  '-------------------- プロパティ:社員氏名 --------------------

  Public Property pSyainSimei() As String

    'Getプロパティ
    Get
      Return Me.mSyainSimei
    End Get

    'Setプロパティ
    Set(ByVal Value As String)
      '【エラーチェック】
      If Value = "" Then
        '未入力はエラー
        Throw New mySyainSimeiException("社員氏名を入力してください")
      Else
        mSyainSimei = Value
      End If
    End Set

  End Property

  '-------------------- プロパティ:社員カナ --------------------
  Public Property pSyainKana() As String

    'Getプロパティ
    Get
      Return mSyainKana
    End Get

    'Setプロパティ
    Set(ByVal Value As String)
      '【エラーチェック】
      '未入力はエラーとしない
      If Value = "" Then
        mSyainKana = Value
      Else
        '全角カタカナチェック
        If Regex.IsMatch(Value, "^[ァ-ー]+$") Then
          mSyainKana = Value
        Else
          Throw New mySyainKanaException( _
          "社員カナを全角カタカナで入力してください")
        End If
      End If

    End Set

  End Property

  '-------------------- プロパティ:更新日時 --------------------
  Public Property pUpdateTime() As Date

    'Getプロパティ
    Get
      Return mUpdateTime
    End Get

    'Setプロパティ
    Set(ByVal Value As Date)
      mUpdateTime = Value
    End Set

  End Property

End Class

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