【第51号】
第51号(2007.2.14発行) ====================================================================== ★★ VB.NETデータベースプログラミング奮闘記 ★★ ---------------------------------------------------------------------- いつもご購読ありがとうございます。ADO.NETの基本的なプログラミングを中 心に掲載します。今後ともよろしくお願い申し上げます。 すぐ使えるADO.NET --> サンプルプログラム満載 http://park5.wakwak.com/‾weblab/ ====================================================================== ■■ VB2005 Express ワンポイント:Partialキーワード ■■ Visual Basic 2005 Express Edition を試しています。前のバージョンより使 いやすく、VB6ユーザにも配慮しているようです。 今回は、Partialキーワードについてです。 新規作成時のフォームクラスは、VB.NETと比較して、たいへんすっきりしてい ます。 Public Class Form1 End Class だけになり、中身は何もありません。VB2005から、Partialキーワードを使うと、 ひとつのクラスを分割してコーディングでき、自動生成部分は別ファイルにな りました。 自動生成部分は、Form1.vbの配下のForm1.designer.vbに作成され、ソースリ ストは次のようになっています。 Partial Class Form1 Inherits System.Windows.Forms.Form '自動生成されたソース End Class クラスの先頭に、Partialキーワードを付加すると、同一クラスを別ファイル に分割することができます。そのため自動生成部分は同一クラスにもかかわら ず、別ファイルに分割されて、ソースリストがたいへんすっきりします。 まだ、Visual Basic 2005 Express Editionをダウンロードしていない方は、 こちらから無料でダウンロードすることができます。 http://www.microsoft.com/japan/msdn/vstudio/express/ ---------------------------------------------------------------------- ■■ マスターテーブル保守 5 ■■ 今回は、社員マスター削除処理について説明します。 【社員テーブル】 ------------------------------------------------------------ key フィールド名 データ型 サイズ 値要求 空文字列の許可 ------------------------------------------------------------ ○ 社員コード テキスト型 5 はい いいえ − 社員氏名 テキスト型 20 はい いいえ − 社員カナ テキスト型 40 いいえ はい − 更新日時 日付/時刻型 − はい − ------------------------------------------------------------ 検索ボタンを押すと、入力された社員コードのレコードを社員テーブルから検 索して、txtSyainSimeiに社員氏名を、txtSyainKanaに社員カナ名をセットし ます。 txtSyainSimeiとtxtSyainKanaのReadOnlyプロパティーはFalseに設定して、入 力できないようにしておきます。 btnDeleteを押すと、入力された社員コードのレコードを、社員テーブルから 削除します。 btnClearを押すと、入力データをクリアして、初期画面に戻します。 ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ 社員マスタ削除 _□×┃ ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ ┃ Label1 txtSyainCode btnSelect ┃┌―――――┐ ┌―――――┐ ┌―――――┐ ┃│社員コード│ │ │ │ 検 索 │ ┃└―――――┘ └―――――┘ └―――――┘ ┃ Label2 txtSyainSimei ┃┌―――――┐ ┌―――――――――┐ ┃│社員氏名 │ │ │ ┃└―――――┘ └―――――――――┘ ┃ Label3 txtSyainKana ┃┌―――――┐ ┌―――――――――┐ ┃│社員カナ │ │ │ ┃└―――――┘ └―――――――――┘ ┃ ┃ btnDelete btnClear ┃┌―――――┐ ┌―――――┐ ┃│ 削 除 │ │ クリア │ ┃└―――――┘ └―――――┘ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ 1レコードを削除するクラスの注意点: Private mUpdateTime 変数には、取得レコードの更新日時フィールドの値を保 存しておきます。この更新日時は、レコード削除時に呼び出すclsDBIOクラス のdeleteRecordメソッドの引数に使用します。 更新日時が取得時と異なっていれば、他で更新されています。その場合には、 レコードを削除せず例外をスローします。また、削除するレコードが見つから ない時も、例外をスローしています。 '★★ Class delete(削除フォーム)は、delete.vbファイルにコーディング '--------- << 社員テーブルの1レコードを削除するクラス >> ------------- Imports System.Data.OleDb Public Class delete Inherits System.Windows.Forms.Form '自動生成部分は省略 '社員テーブル取得時の更新日時 Private mUpdateTime As Date '------------------------------------------------------------------- ' フォームロード '------------------------------------------------------------------- Private Sub delete_Load _ (ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles MyBase.Load '画面初期化 initForm() Me.txtSyainCode.Text = "" End Sub '------------------------------------------------------------------- ' 検索ボタン押下 '------------------------------------------------------------------- Private Sub btnKensaku_Click _ (ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles btnKensaku.Click Dim dtRec As New DataTable() 'リターン値 Try Dim oDBIO As New clsDBIO("Read") dtRec = oDBIO.getKeyRecord("社員テーブル", Me.txtSyainCode.Text) If dtRec.Rows.Count = 1 Then 'レコード取得成功 Me.txtSyainSimei.Text = CStr(dtRec.Rows(0)("社員氏名")) Me.txtSyainKana.Text = CStr(dtRec.Rows(0)("社員カナ")) Me.mUpdateTime = CDate(dtRec.Rows(0)("更新日時")) '削除画面設定 deleteForm() Else MessageBox.Show _ ("この社員コードは社員テーブルにありません", "社員コード入力エラー") Me.txtSyainCode.Focus() '画面初期化 initForm() End If Catch oExcept As myDBIOException '例外が発生した時の処理(レコード取得エラー) MessageBox.Show(oExcept.Message, "例外発生") '画面初期化 initForm() Me.txtSyainCode.Text = CStr(dtRec.Rows(0)("社員コード")) Catch oExcept As Exception '例外が発生した時の処理 MessageBox.Show(oExcept.ToString, "例外発生") End Try End Sub '------------------------------------------------------------------- ' クリアボタン押下 '------------------------------------------------------------------- Private Sub btnClear_Click _ (ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles btnClear.Click '画面初期化 initForm() Me.txtSyainCode.Text = "" End Sub '------------------------------------------------------------------- ' 画面初期化 '------------------------------------------------------------------- Sub initForm() '項目初期化 Me.txtSyainKana.Text = "" Me.txtSyainSimei.Text = "" Me.mUpdateTime = Now() '社員コード入力可能 Me.txtSyainCode.Enabled = True Me.txtSyainCode.ReadOnly = False Me.txtSyainCode.TabStop = True '社員コードにフォーカス Me.txtSyainCode.Focus() '検索ボタン活性化 Me.btnKensaku.Enabled = True '削除ボタン不活性化 Me.btnDelete.Enabled = False 'クリアボタン不活性化 Me.btnClear.Enabled = False '氏名入力不可 Me.txtSyainSimei.ReadOnly = True Me.txtSyainSimei.TabStop = False 'カナ名入力不可 Me.txtSyainKana.ReadOnly = True Me.txtSyainKana.TabStop = False End Sub '------------------------------------------------------------------- ' 削除画面設定 '------------------------------------------------------------------- Sub deleteForm() '社員コード入力不可 Me.txtSyainCode.ReadOnly = True Me.txtSyainCode.TabStop = False '検索ボタン不活性化 Me.btnKensaku.Enabled = False '削除ボタン活性化 Me.btnDelete.Enabled = True '削除ボタンにフォーカス Me.btnDelete.Focus() 'クリアボタン活性化 Me.btnClear.Enabled = True '氏名入力不可 Me.txtSyainSimei.ReadOnly = True Me.txtSyainSimei.TabStop = False 'カナ名入力不可 Me.txtSyainKana.ReadOnly = True Me.txtSyainKana.TabStop = False End Sub '---------------------------------------------------------------------- ' 削除ボタン押下処理 '---------------------------------------------------------------------- Private Sub btnDelete_Click _ (ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles btnDelete.Click Try Dim oRow As DataRow Dim deleteCount As Integer Dim oDBIO As New clsDBIO() oRow = oDBIO.createDataRow("社員テーブル") oRow("社員コード") = Me.txtSyainCode.Text oRow("更新日時") = Me.mUpdateTime Dim oSyain As New clsDeleteSyain(oRow) deleteCount = oDBIO.deleteRecord(oSyain) '画面初期化 MessageBox.Show("正常に削除されました", "社員コード削除処理") initForm() Me.txtSyainCode.Text = "" Catch oExcept As mySyainCodeException '独自例外が発生した時の処理 MessageBox.Show(oExcept.Message, "社員コード入力エラー") Me.txtSyainCode.Focus() Catch oExcept As myDBIOException '独自例外が発生した時の処理 MessageBox.Show(oExcept.Message, "入力エラー") initForm() Catch oExcept As Exception 'その他例外が発生した時の処理 MessageBox.Show(oExcept.ToString, "例外発生") End Try End Sub End Class '★★これ以下のソースは、clsSyain.vbファイルにコーディング(前号を再掲) '===========================【社員クラス】============================ Option Strict On Imports System.Text.RegularExpressions Public Interface ISyain Sub setSyainCode(ByVal parSyain As DataRow) End Interface 'Public MustInherit Class clsSyainBase Public Class clsSyainBase Protected mSyainCode As String Protected mSyainSimei As String Protected mSyainKana As String Protected mUpdateTime As Date '---------------------------------------------------------------------- '機能:コンストラクタ '引数:なし '---------------------------------------------------------------------- Sub New() MyBase.New() End Sub '-------------------- プロパティ:社員氏名 -------------------- 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 '未入力はエラー Throw New mySyainKanaException("社員カナを入力してください") 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 '-------------------- 【社員氏名セット】 -------------------- Protected Sub setSyainSimei(ByVal parSyain As DataRow) If IsDBNull(parSyain("社員氏名")) Then Throw New Exception("clsUpdateSyain.New引数例外:社員氏名未設定") Else pSyainSimei = CStr(parSyain("社員氏名")) End If End Sub '-------------------- 【社員カナセット】 -------------------- Protected Sub setSyainKana(ByVal parSyain As DataRow) If IsDBNull(parSyain("社員カナ")) Then Throw New Exception("clsUpdateSyain.New引数例外:社員カナ未設定") Else pSyainKana = CStr(parSyain("社員カナ")) End If End Sub '-------------------- 【更新日時セット】 -------------------- Protected Sub setSyainKosinNitizi(ByVal parSyain As DataRow) If IsDBNull(parSyain("更新日時")) Then Throw New Exception("clsUpdateSyain.New引数例外:更新日時未設定") Else pUpdateTime = CDate(parSyain("更新日時")) End If End Sub End Class '==========================【社員追加基本クラス】===================== Public Class clsInsertSyainBase Inherits clsSyainBase Implements ISyain '------------------------------------------------------------------- '機能:コンストラクタ '引数:なし '------------------------------------------------------------------- Sub New() MyBase.New() 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) = True Then Throw New mySyainCodeException("社員コード登録済") Else Me.mSyainCode = Value End If End If End If End Set End Property '-------------------- 【社員コードセット】 -------------------- Protected Sub setSyainCode(ByVal parSyain As DataRow) _ Implements ISyain.setSyainCode If IsDBNull(parSyain("社員コード")) Then Throw New Exception _ ("clsInsertSyain.New引数例外:社員コードが未設定") Else pSyainCode = CStr(parSyain("社員コード")) End If End Sub End Class '======================【社員読取更新削除基本クラス】================= Public Class clsSUDSyainBase Inherits clsSyainBase Implements ISyain '------------------------------------------------------------------- '機能:コンストラクタ '引数:なし '------------------------------------------------------------------- Sub New() MyBase.New() 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 '【社員コードセット】 Protected Sub setSyainCode(ByVal parSyain As DataRow) _ Implements ISyain.setSyainCode If IsDBNull(parSyain("社員コード")) Then Throw New Exception _ ("clsInsertSyain.New引数例外:社員コードが未設定") Else pSyainCode = CStr(parSyain("社員コード")) End If End Sub End Class '============================【社員追加クラス】======================= Public Class clsInsertSyain Inherits clsInsertSyainBase '------------------------------------------------------------------- '機能:コンストラクタ '引数:in 社員1レコード分のデータ '------------------------------------------------------------------- Sub New(ByVal parSyain As DataRow) MyBase.New() '【社員コードセット】 MyBase.setSyainCode(parSyain) '【社員氏名セット】 MyBase.setSyainSimei(parSyain) '【社員カナセット】 MyBase.setSyainKana(parSyain) End Sub End Class '============================【社員更新クラス】======================= Public Class clsUpdateSyain Inherits clsSUDSyainBase '------------------------------------------------------------------- '機能:コンストラクタ '引数:in 社員1レコード分のデータ '------------------------------------------------------------------- Sub New(ByVal parSyain As DataRow) MyBase.New() '【社員コードセット】 MyBase.setSyainCode(parSyain) '【社員氏名セット】 MyBase.setSyainSimei(parSyain) '【社員カナセット】 MyBase.setSyainKana(parSyain) '【更新日時セット】 MyBase.setSyainKosinNitizi(parSyain) End Sub End Class '============================【社員削除クラス】======================= Public Class clsDeleteSyain Inherits clsSUDSyainBase 'Private mSyainCode As String 'Private mUpdateTime As Date '------------------------------------------------------------------- '機能:コンストラクタ '引数:in 社員1レコード分のデータ '------------------------------------------------------------------- Sub New(ByVal parSyain As DataRow) MyBase.New() '【社員コードセット】 MyBase.setSyainCode(parSyain) '【更新日時セット】 MyBase.setSyainKosinNitizi(parSyain) End Sub End Class '============================【社員検索クラス】======================= Public Class clsSelectSyain Inherits clsSUDSyainBase '------------------------------------------------------------------- '機能:コンストラクタ '引数:in 社員1レコード分のデータ '------------------------------------------------------------------- Sub New(ByVal parSyain As DataRow) MyBase.New() '【社員コードセット】 MyBase.setSyainCode(parSyain) End Sub End Class '============================【独自例外クラス】======================= '--------------- DBIO独自エラーメッセージ例外クラス--------------- Public Class myDBIOException Inherits ApplicationException Public Sub New(ByVal errorMessage As String) MyBase.New(errorMessage) End Sub End Class '--------------- 社員コードエラーメッセージ例外クラス--------------- Public Class mySyainCodeException Inherits ApplicationException Public Sub New(ByVal errorMessage As String) MyBase.New(errorMessage) End Sub End Class '--------------- 社員氏名エラーメッセージ例外クラス--------------- Public Class mySyainSimeiException Inherits ApplicationException Public Sub New(ByVal errorMessage As String) MyBase.New(errorMessage) End Sub End Class '--------------- 社員カナエラーメッセージ例外クラス--------------- Public Class mySyainKanaException Inherits ApplicationException Public Sub New(ByVal errorMessage As String) MyBase.New(errorMessage) End Sub End Class ---------------------------------------------------------------------- ■■ 次号予告 第52号(3月14日発行予定) ■■ 1. VB2005 Express ワンポイント 2. マスターテーブル保守 ====================================================================== 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.