バックナンバー: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」ホームページに掲載されてい る会社名・製品名等は、各社の登録商標または商標です。 ======================================================================
↑このページ(メルマガ:VB.NETデータベース) 先頭へ | すぐ使えるADO.NET ホームへ
Copyright© すぐ使えるADO.NET. All rights reserved.