バックナンバー: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.