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