バックナンバー:VB.NETデータベースプログラミング
ADO.NETの基本的なプログラミングを中心に、すぐ使えるサンプルプログラム満載です。
【第25号】
第25号(2005.4.25発行) ====================================================================== ★★ VB.NETデータベースプログラミング奮闘記 ★★ ---------------------------------------------------------------------- いつもご購読ありがとうございます。ADO.NETの基本的なプログラミングを中 心に掲載しますので、今後ともよろしくお願い申し上げます。 すぐ使えるADO.NET --> サンプルプログラム満載 http://park5.wakwak.com/‾weblab/ ====================================================================== ■■ VB.NETワンポイント:正規表現で文字列チェック ■■ 前号では、入力値の数字値チェックに正規表現を使いましたが、今回は、文字 列のエラーチェックを紹介します。RegexクラスのIsMatchメソッドを使います ので、 Imports System.Text.RegularExpressions 名前空間をインポートして ください。 ◆郵便番号 ---> ^[0-9]{3}¥-?[0-9]{4}$ 123-4567または、1234567の入力パターンを正規表現でチェックします。 先頭文字から3桁は0から9なので、^[0-9]{3,3}としますが、{3,3}は{3}と同じ 意味になりますので、^[0-9]{3}とします。4文字目は - があっても無くても よいので、¥-? とします。- は特殊文字なので、文字の直前に¥を付加します。 ? は、その直前の1文字があっても無くてもよいという意味になります。 そし て、末尾までの4桁数字は、[0-9]{4}$ と表現できます。 これで、パターンのチェックはできますが、存在しない郵便番号もチェックす るのであれば、郵便番号テーブルを作成して、テーブルに存在するかしないか のチェックもあったほうが、より良いプログラムになります。 ◆全角カタカナ ---> ^[ァ-ー]+$ フリガナチェックをするときに使うと、便利です。 .NET Frameworkでは、正規表現はUnicodeのコード順で決まりますので、 ^[ァ-ー]+$ になりますが、ァォィゥェォヰヱヴヵヶー等を除外する場合には、 たとえば、次のように記述すれば、不要なカタカナを除外することができます。 ^[アイウエオ-ロワン]+$ 実際には、コード表で文字を確認しながら、正規表現を作成するほうが、間違 いがないかと思います。 ---------------------------------------------------------------------- ■■ ADO.NETのトランザクション制御 4(完) ■■ トランザクション制御を使って、社員テーブルと権限テーブルに登録するプロ グラムを作成します。使用するテーブル定義とフォームレイアウトは、第22号 を参照してください。今回は、前号で紹介しなかったDBアクセスクラスのメッ ソドについて説明します。 ◆DBアクセスクラスclsDBIO getAllBumonメソッドは、部門テーブル全レコー ド取得するメソッドす。dataAdapterオブジェクトのFillメソッドを呼び出し、 全レコードを取得しています。このとき、 DBのオープンとクローズは、内部 で自動的に実行してくれますので、明示的にopenメソッドとcloseメソッドを 呼び出す必要はありません。 ◆DBアクセスクラスclsDBIO existKeySyainメソッドは、社員テーブルのキー 値のレコードの有無を調べるメソッドです。キー値のレコード数を調べますの で、CommandオブジェクトのExecuteScalarメソッドを使います。戻り値がレ コード件数ですから、その数を調べれて、1であればTrueを、そうでなければ、 Falseを戻り値にセットします。 なお、いずれのメソッドも、エラーが発生すれば、エラーメッセージを引数に セットして、例外をThrowしています。 それでは、全ソースリストを掲載します。 --【プログラムソースリスト】------------------------------------------ ■ Form1.vbファイル ■ Public Class Form1 Inherits System.Windows.Forms.Form #Region " Windows フォーム デザイナで生成されたコード " '自動生成部分省略 #End Region '----------<< フォームロード処理 >>---------- Private Sub Form1_Load _ (ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles MyBase.Load Try Dim oDBIO As New clsDBIO() Dim oDataTable As DataTable '部門テーブルの全レコードを取得する oDataTable = oDBIO.getAllBumon() 'コンボボックスに部門名を表示できるようにする Me.cmbBumonMei.DisplayMember = "部門名" '部門名に対応した部門コードを SelectdValueで取得できるようにする Me.cmbBumonMei.ValueMember = "部門コード" 'コンボボックスに部門テーブルデータを連結する Me.cmbBumonMei.DataSource = oDataTable Catch oExcept As Exception '例外が発生した時の処理 MessageBox.Show(oExcept.ToString, "フォームロード例外発生") End Try End Sub '----------<< コンボボックスの選択値が変更された場合 >>---------- Private Sub cmbBumonMei_SelectedIndexChanged _ (ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles cmbBumonMei.SelectedIndexChanged '選択した部門コードをラベルに表示 If Me.cmbBumonMei.SelectedIndex <> -1 Then Me.lblBumonCode.Text = CStr(Me.cmbBumonMei.SelectedValue) End If End Sub '----------<< クリアボタン処理 >>---------- Private Sub btnClear_Click _ (ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles btnClear.Click Me.txtSyainCode.Text = "" Me.txtSyainSimei.Text = "" Me.txtSyainKana.Text = "" Me.txtPassWord.Text = "" Me.cmbBumonMei.SelectedIndex = 0 Me.txtSyainCode.Focus() End Sub '-----<< 登録ボタン処理(社員テーブルにレコード追加) >>----- Private Sub btnInsert_Click _ (ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles btnInsert.Click Try Dim oDBIO As New clsDBIO() Dim oSyain As New clsSyainToroku() '入力項目のエラーチェック oSyain.p社員コード = Me.txtSyainCode.Text oSyain.p社員氏名 = Me.txtSyainSimei.Text oSyain.p社員カナ = Me.txtSyainKana.Text oSyain.p部門コード = Me.lblBumonCode.Text oSyain.pパスワード = Me.txtPassWord.Text '社員テーブルにレコード追加 Dim recCount As Integer recCount = oDBIO.addSyainKengen(oSyain) If recCount = 1 Then MessageBox.Show("登録しました", "登録完了") Else MessageBox.Show("登録に失敗しました", "登録失敗") End If Catch oExcept As clsException '例外が発生した時の処理 MessageBox.Show(oExcept.Message, "エラー発生") Catch oExcept As Exception '例外が発生した時の処理 MessageBox.Show(oExcept.ToString, "例外発生") End Try End Sub End Class ■ clsSyainToroku.vbファイル ■ Imports System.Text.RegularExpressions Public Class clsSyainToroku '---------------<< 変数 >>--------------- Private m社員コード As String Private m社員氏名 As String Private m社員カナ As String Private m部門コード As String Private mパスワード As String Private mDBIO As clsDBIO '---------------<< コンストラクタ >>--------------- Public Sub New() '必ず1行目に記述(コンストラクタに引数のない場合は省略可能) MyBase.New() Try 'DBアクセスオブジェクト生成 mDBIO = New clsDBIO() Catch oExcept As Exception Throw New Exception _ ("clsDBIOのコンストラクタで例外発生. " + oExcept.ToString) End Try End Sub '---------------<< プロパティ >>--------------- '◆社員コードプロパティ Public Property p社員コード() As String '◇Getプロパティ Get Return m社員コード End Get '◇Setプロパティ Set(ByVal Value As String) '********** 入力値エラーチェック ********** '数字以外はエラー If Not Regex.IsMatch(Value, "^[0-9]+$") Then Throw New clsException("社員コードは数字で入力してください") End If '5桁以外はエラー If Not Value.Length = 5 Then Throw New clsException("社員コードは5桁で入力してください") End If '社員マスタにあればエラー If mDBIO.existKeySyain(Value) = True Then Throw New clsException("この社員コードは登録済です") End If m社員コード = Value End Set End Property '◆社員氏名プロパティ Public Property p社員氏名() As String '◇Getプロパティ Get Return m社員氏名 End Get '◇Setプロパティ Set(ByVal Value As String) '********** 入力値エラーチェック ********** '未入力はエラー If Value = "" Then Throw New clsException("社員氏名を入力してください") End If m社員氏名 = Value End Set End Property '◆社員カナプロパティ Public Property p社員カナ() As String '◇Getプロパティ Get Return m社員カナ End Get '◇Setプロパティ Set(ByVal Value As String) '********** 入力値エラーチェック ********** '全角カタカナチェック If Not Regex.IsMatch(Value, "^[ァ-ー]+$") Then Throw New clsException _ ("社員カナを全角カタカナで入力してください") End If m社員カナ = Value End Set End Property '◆部門コードプロパティ Public Property p部門コード() As String '◇Getプロパティ Get Return m部門コード End Get '◇Setプロパティ Set(ByVal Value As String) 'コンボボックスから選んだ部門コードをセット m部門コード = Value End Set End Property '◆パスワードプロパティ Public Property pパスワード() As String '◇Getプロパティ Get Return mパスワード End Get '◇Setプロパティ Set(ByVal Value As String) '********** 入力値エラーチェック ********** '英数字以外はエラー If Not Regex.IsMatch(Value, "^[0-9A-Za-z]+$") Then Throw New clsException("パスワードは英数字で入力してください") End If '5桁未満または15桁超はエラー If Value.Length < 5 Or Value.Length > 15 Then Throw New clsException("パスワードの文字数が範囲外です") End If mパスワード = Value End Set End Property End Class ■ clsDBIO.vbファイル ■ Imports System.Data.OleDb Public Class clsDBIO '--------------------< メンバ:変数 >-------------------- 'コネクション 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のコンストラクタで例外発生. " + oExcept.ToString) End Try End Sub '========================================================= ' 機能:部門テーブル全レコード取得メソッド ' 引数:なし ' 戻値:DataTable型 取得したテーブルレコード行コレクション '========================================================= Public Function getAllBumon() As DataTable Dim retDataTable As New DataTable() 'リターン値 Dim dataAdapter As New OleDbDataAdapter() Try 'SQL文設定 mCommand.CommandText = _ "SELECT 部門コード, 部門名 FROM 部門テーブル" 'テーブルからレコード取得 dataAdapter.SelectCommand = mCommand dataAdapter.Fill(retDataTable) Catch oExcept As Exception Throw New Exception _ ("clsTableSyainのgetAllRecで例外発生. " + oExcept.ToString) End Try '◆戻値を設定してリターン Return retDataTable End Function '========================================================= ' 機能:社員テーブルのキー値レコードの有無を調べるメソッド ' 引数:キー値 ' 戻値:ある-->True、ない-->False '========================================================= Public Function existKeySyain(ByVal parKey As String) As Boolean Dim retBool As Boolean 'リターン値 Try 'SQL文設定 mCommand.CommandText = _ "SELECT COUNT(*) FROM 社員テーブル WHERE 社員コード = @Key" '***** SQL文の引数設定 ***** mCommand.Parameters.Clear() mCommand.Parameters.Add( _ New OleDbParameter("@key", OleDbType.Char, 5)) '----------< コマンドパラメータに値を設定 >---------- mCommand.Parameters("@key").Value = parKey 'キー値の設定 'DB接続を開く mConn.Open() 'レコード件数取得 Dim Count As Integer = mCommand.ExecuteScalar() '----------< 戻値を設定 >---------- If Count = 1 Then retBool = True Else retBool = False End If Catch oExcept As Exception Throw New Exception _ ("clsTableSyainのexistKeyRecで例外発生. " + 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 retBool End Function '========================================================= ' 機能:社員テーブルと権限テーブルに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で例外発生. " + 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 End Class ■ clsException.vbファイル ■ Public Class clsException Inherits ApplicationException Public Sub New(ByVal errorMessage As String) MyBase.New(errorMessage) End Sub End Class ---------------------------------------------------------------------- ■■ 次号予告 第26号(5月18日発行予定) ■■ 1. VB.NETワンポイント 2. ADO.NET:テキストボックスをDBテーブルのレコードにバインドする ====================================================================== 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.