すぐ使えるADO.NET

【Visual BasicによるADO.NETデータベースプログラミング】

本の紹介

バックナンバー:VB.NETデータベースプログラミング

ADO.NETの基本的なプログラミングを中心に、すぐ使えるサンプルプログラム満載です。




【第67号】

 第67号(2008.11.5発行)
======================================================================
        ★★ -- VB.NETデータベースプログラミング奮闘記 -- ★★
            (VB 2005 Express & SQL Server 2005 Express)
----------------------------------------------------------------------
いつもご購読ありがとうございます。ADO.NETの基本的なプログラミングを中
心に掲載します。今後ともよろしくお願い申し上げます。

すぐ使えるADO.NET --> http://park5.wakwak.com/‾weblab/
----------------------------------------------------------------------
[やさしいVB2008 ADO.NET]を、新規に開設しました。内容はまだまだですが、
こちらもよろしくお願い致します。

やさしいVB2008 ADO.NET --> https://adonetvb.com/
======================================================================
                  ■■ 社員テーブルを更新する 2 ■■

社員コードを入力して、検索ボタンを押下すると、該当する社員レコードを表
示する。内容を修正後、更新ボタンを押下すれば、入力データのエラーチェッ
クをして、エラーが無ければ、社員テーブルの該当レコードを更新する。

【sampleデータベースの社員テーブル】
----------------------------------------------------------------------
key  列 名   データ型    nullを許容  備 考
----------------------------------------------------------------------
○ 社員コード  nchar(5)       許容しない  英数字のみ
− 社員氏名   nvarchar(20)   許容しない
− 社員カナ   nvarchar(40)   許容しない
− 部署コード  nchar(4)       許容しない
− 更新日時   datetime       許容しない
----------------------------------------------------------------------

【sampleデータベースの部署テーブル】
----------------------------------------------------------------------
key  列 名   データ型    nullを許容  備 考
----------------------------------------------------------------------
○ 部署コード  nchar(4)       許容しない  英数字のみ
− 部署名    nvarchar(20)   許容しない
− 更新日時   datetime       許容しない
----------------------------------------------------------------------
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ 社員テーブル更新                _□×┃ ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ ┃  Label1    TxtShainCode   BtnRetrieval ┃┌―――――┐ ┌―――――┐   ┌――――┐ ┃│社員コード│ │     │   │ 検索 │ ┃└―――――┘ └―――――┘   └――――┘ ┃  Label2    TxtShainShimei ┃┌―――――┐ ┌――――――――┐ ┃│社員氏名 │ │        │ ┃└―――――┘ └――――――――┘ ┃  Label3    TxtShainKana ┃┌―――――┐ ┌――――――――――――――┐ ┃│社員カナ │ │              │ ┃└―――――┘ └――――――――――――――┘ ┃  Label4    CboBushoMei ┃┌―――――┐ ┌―――――――――┬―┐ ┃│部署   │ │         │▼│ ┃└―――――┘ └―――――――――┴―┘ ┃ BtnUpdate    BtnClear ┃┌――――┐  ┌―――――┐ ┃│ 更新 │  │ クリア │ ┃└――――┘  └―――――┘ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ 【検索ボタンクリック処理】(第66号) 入力した社員コードが、社員テーブルに存在すれば、該当レコードを表示して、 社員コードを入力不可に設定します。社員テーブルにレコードが存在しなけれ ば、エラーメッセージを表示します。 【クリアボタンクリック処理】(第66号) 社員コードと検索ボタンのEnableプロパティをTrue、他はFalseにして、入出 力項目を初期状態に戻します。 【更新ボタンクリック処理】 入力データのエラーチェックをして、エラーがなければ、該当レコードを更新 します。 ---------------------------------------------------------------------- ■■ 検索ボタンクリック処理(修正) ■■ 前号では、社員データをGetKeyDataメソッドで取得するようにしていましたが、 社員データ更新クラスClsUpdateShainのコンストラクタで取得するように修正 しました。これにより社員コードを引数に指定して、インスタンスを生成する だけによくなります。 まず、Private shain As ClsUpdateShain とクラス変数を宣言します。そして、 検索ボタン押下処理で、インスタンスを生成して、社員データを取得します。 Me.shain = New ClsUpdateShain(Me.TxtShainCode.Text) 社員コードや社員氏名などは、プロパティから取得できます。 Me.TxtShainShimei.Text = Me.shain.ShainShimei Me.TxtShainKana.Text = Me.shain.ShainKana 修正後のソースリストです。恐れ入りますが、差替えをお願いします。 --【プログラムソースリスト(ファイル名:FormUpdate66.vb)】----------- '----------<< 検索ボタン押下処理 >>---------- Private Sub BtnRetrieval_Click _ (ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles BtnRetrieval.Click Try '社員データ更新インスタンス生成 '社員テーブルのレコード取得をカプセル化 Me.shain = New ClsUpdateShain(Me.TxtShainCode.Text) Me.TxtShainShimei.Text = Me.shain.ShainShimei Me.TxtShainKana.Text = Me.shain.ShainKana '部署名取得 Dim bushoTable As New ClsBushoTableIO Dim dtBusho As New DataTable dtBusho = bushoTable.GetKeyData(Me.shain.BushoCode) '取得した部署名にインデックスを設定 Me.CboBushoMei.SelectedIndex _ = Me.CboBushoMei.FindString(CStr(dtBusho.Rows(0)("部署名"))) '社員コード・検索ボタン入力不可 Me.TxtShainCode.Enabled = False Me.BtnRetrieval.Enabled = False Me.TxtShainShimei.Enabled = True Me.TxtShainKana.Enabled = True Me.CboBushoMei.Enabled = True Me.BtnRetrieval.Enabled = False Me.BtnUpdate.Enabled = True '社員氏名にフォーカス Me.TxtShainShimei.Focus() Catch ex As myShainCodeException '社員コードエラー MessageBox.Show(ex.Message, "入力エラー") Catch ex As myDBIOException 'DBIO独自例外発生時 MessageBox.Show(ex.Message, "エラー発生") Catch ex As Exception MessageBox.Show(ex.ToString, "例外発生") End Try End Sub ---------------------------------------------------------------------- ■■ 更新ボタンクリック処理 ■■ 入力した社員コードや社員氏名などは、ClsUpdateSyainのsetプロパティを使っ て取り込みます。エラーチェックは、setプロパティで行い、エラーがあれば、 独自例外をスローします。 Me.shain.ShainShimei = Me.TxtShainShimei.Text Me.shain.ShainKana = Me.TxtShainKana.Text Me.shain.BushoCode = CStr(Me.CboBushoMei.SelectedValue) 社員テーブルの更新処理は、ClsUpdateShainのインスタンスを引数に指定して、 ClsShainTableIOクラスのUpdateKeyRecordメソッドを呼び出します。 --【プログラムソースリスト(ファイル名:FormUpdate66.vb)】----------- '----------<< 更新ボタン押下処理 >>---------- Private Sub BtnUpdate_Click _ (ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles BtnUpdate.Click Try Me.shain.ShainShimei = Me.TxtShainShimei.Text Me.shain.ShainKana = Me.TxtShainKana.Text Me.shain.BushoCode = CStr(Me.CboBushoMei.SelectedValue) Dim shainTable As New ClsShainTableIO shainTable.UpdateKeyRecord(Me.shain) '正常終了メッセージ MessageBox.Show("正常に更新されました", "更新処理") '画面初期化 Me.ClearForm() Me.TxtShainCode.Text = "" Catch oExcept As myShainCodeException '社員コード例外が発生した時の処理 MessageBox.Show(oExcept.Message, "社員コードエラー") Me.TxtShainCode.Focus() Catch ex As myShainShimeiException '社員氏名例外が発生した時の処理 MessageBox.Show(ex.Message, "社員氏名エラー") Me.TxtShainShimei.Focus() Catch ex As myShainKanaException '社員カナ例外が発生した時の処理 MessageBox.Show(ex.Message, "社員カナエラー") Me.TxtShainKana.Focus() Catch ex As myDBIOException '独自例外が発生した時の処理 MessageBox.Show(ex.Message, "DBアクセスエラー") Catch ex As Exception '例外が発生した時の処理 MessageBox.Show(ex.ToString, "例外発生") End Try End Sub ---------------------------------------------------------------------- ■■ ClsUpdateSyain クラス ■■ 一部基本クラスの追加修正をしました。●印で明示してあります。 ClsShainBaseクラスに Protected shainCodeValue As String Private koushinNichijiValue As DateTime を追加しました。継承クラスに宣言している Private shainCodeValue As String を削除してください。さらに更新日時を保存するプロパティとして Public Property KoushinNichiji() As DateTime を追加しました。 前号のファイル名に誤りがありました。ClsSyain.vbをClsShain.vbに直し ています。 --【プログラムソースリスト(ファイル名:ClsShain.vb)】----------- Option Strict On Imports System.Text.RegularExpressions Public MustInherit Class ClsShainBase '---------------------< メンバ:変数 >------------------------ Protected shainCodeValue As String '●add Private shainSimeiValue As String Private shainKanaValue As String Private bushoCodeValue As String Private koushinNichijiValue As DateTime '●add '------------------------------------------------------------------- ' 機能:コンストラクタ ' 引数:なし '------1---------2---------3---------4---------5----------6--------- Sub New() MyBase.New() '必ず最初に基本クラスのコンストラクタを呼び出す End Sub '-------------------- プロパティ:社員コード -------------------- Public MustOverride Property ShainCode() As String '-------------------- プロパティ:社員氏名 -------------------- Public Property ShainShimei() As String 'Getプロパティ Get Return shainSimeiValue End Get 'Setプロパティ Set(ByVal Value As String) '【エラーチェック】 If Value = "" Then '未入力はエラー Throw New myShainShimeiException _ ("社員氏名を入力してください") Else shainSimeiValue = Value End If End Set End Property '-------------------- プロパティ:社員カナ -------------------- Public Property ShainKana() As String 'Getプロパティ Get Return shainKanaValue End Get 'Setプロパティ Set(ByVal Value As String) '【エラーチェック】 If Value = "" Then '未入力はエラー Throw New myShainKanaException _ ("社員カナを入力してください") Else '全角カタカナ以外はエラー If Regex.IsMatch(Value, "^[ァ-ー]+$") Then shainKanaValue = Value Else Throw New myShainKanaException _ ("社員カナを全角カタカナで入力してください") End If End If End Set End Property '-------------------- プロパティ:部署コード -------------------- Public Property BushoCode() As String 'Getプロパティ Get Return bushoCodeValue End Get 'Setプロパティ Set(ByVal Value As String) '【エラーチェック】 If Value = "" Then '未入力はエラー '●myShainShimeiException --> Exception Throw New Exception _ ("部署コードを選択してください") Else bushoCodeValue = Value End If End Set End Property '● add start '-------------------- プロパティ:更新日時 -------------------- Public Property KoushinNichiji() As DateTime 'Getプロパティ Get Return koushinNichijiValue End Get 'Setプロパティ Set(ByVal Value As DateTime) '【エラーチェック】 If Value = Nothing Then '未設定はエラー Throw New Exception _ ("更新日時未設定") Else koushinNichijiValue = Value End If End Set End Property '● add end End Class '==================【社員選択更新削除基本クラス】================== Public MustInherit Class ClsShainSUD Inherits ClsShainBase '---------------------< メンバ:変数 >------------------------- 'Private shainCodeValue As String '● delete '-------------------------------------------------------------- ' 機能:コンストラクタ ' 引数:DataRow '-------------------------------------------------------------- Sub New() MyBase.New() End Sub '-------------------- プロパティ:社員コード ------------------ Public Overrides Property ShainCode() As String 'Getプロパティ Get Return shainCodeValue End Get 'Setプロパティ Set(ByVal Value As String) '未入力はエラー If Value = "" Then Throw New myShainCodeException("社員コード未入力") Else '数字以外はエラー If Not Regex.IsMatch(Value, "^[0-9]+$") Then Throw New _ myShainCodeException("社員コードに数字以外あり") Else '社員テーブルアクセスオブジェクト Dim dbIO As New ClsShainTableIO() '社員マスタにこの社員コードがなければエラー If dbIO.ExistKeyData(Value) = False Then Throw New myShainCodeException("社員コード未登録") Else shainCodeValue = Value End If End If End If End Set End Property End Class '=========================【社員更新クラス】======================== Public Class ClsUpdateShain Inherits ClsShainSUD '--------------------------------------------------------------- ' 機能:コンストラクタ ' 引数:社員コード '--------------------------------------------------------------- Sub New(ByVal ShainCode As String) MyBase.New() Try Dim dt As New DataTable Dim shainTable As New ClsShainTableIO 'レコード取得 dt = shainTable.GetKeyData(ShainCode) If dt.Rows.Count = 1 Then 'レコードがあった時 MyBase.ShainCode = ShainCode MyBase.ShainShimei = CStr(dt.Rows(0)("社員氏名")) MyBase.ShainKana = CStr(dt.Rows(0)("社員カナ")) MyBase.BushoCode = CStr(dt.Rows(0)("部署コード")) MyBase.KoushinNichiji = CDate(dt.Rows(0)("更新日時")) Else 'レコードがなかった時 Throw New myShainCodeException("レコードがない") End If Catch ex As myShainCodeException Throw New myShainCodeException(ex.Message) Catch ex As myDBIOException Throw New myDBIOException(ex.Message) Catch ex As Exception Throw New Exception("例外発生:" & ex.ToString) End Try End Sub End Class ---------------------------------------------------------------------- ■■ ClsShainTableIOのGetKeyDataメソッドの例外修正 ■■ Throw New myDBIOException("・・・・・・・・")を Throw New myShainCodeException("・・・・・・・・")に修正しました。 社員コードのエラーを明確にするための修正です。 それに伴い、Catch ex As myShainCodeException 句を追加しました。 --【プログラムソースリスト(ファイル名:ClsShainTableIO.vb)】-------- '******************************************************************* ' 機能:引数にした社員コードのレコードを社員テーブルから取得する ' 引数:ByVal 社員コード(String型) ' 戻値:引数に指定した社員コードのレコード(DataTble型) '******1*********2*********3*********4*********5**********6********* Public Overloads _ Function GetKeyData(ByVal KeyCode As String) As DataTable Dim RetDataTable As New DataTable() 'リターン値 Try '引数Nothing(未設定)・空白チェック If KeyCode Is Nothing Or KeyCode = "" Then Throw New myShainCodeException _ ("エラー:社員コードが未入力") End If '引数の前後の空白は除去する KeyCode = KeyCode.Trim() 'キー値文字チェック(キー値は英数字のみで構成されている) If Not Regex.IsMatch(KeyCode, "^[0-9a-zA-Z]+$") Then '英数字以外はエラー Throw New myShainCodeException _ ("エラー:社員コードに不正な文字あり") End If 'キー値長さチェック(社員コードは5桁) If Not KeyCode.Length = 5 Then '5桁以外はエラー Throw New myShainCodeException _ ("エラー:社員コードの桁数が正しくない") End If '社員テーブルから引数コードのレコードを取得する RetDataTable = _ MyBase.GetKeyData("社員テーブル", "社員コード", KeyCode) Catch ex As myShainCodeException '● add Throw New myShainCodeException(ex.Message) Catch ex As myDBIOException Throw New myDBIOException(ex.Message) Catch ex As Exception '● 例外文言ミス修正 getShainTableRec --> GetKeyData Throw New Exception _ ("clsShainTBLIOのGetKeyDataで例外発生:" & ex.ToString) End Try '◆戻値を設定してリターン Return RetDataTable End Function ---------------------------------------------------------------------- 次号は、今号で掲載できなかったテーブル更新メソッドです。 ====================================================================== VB.NET データベースプログラミング奮闘記 発行者:ウェブ実験室(adonet‾live.jp ‾はあっとマーク) 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」ホームページに掲載されてい る会社名・製品名等は、各社の登録商標または商標です。 ======================================================================

Copyright© すぐ使えるADO.NET. All rights reserved.