すぐ使えるADO.NET

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

本の紹介

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

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




<< 前の号 目次 最新号 >>

【第72号】

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

すぐ使えるADO.NET --> http://park5.wakwak.com/‾weblab/
====================================================================
         ■■ マスターテーブル保守改良版 テーブル削除 ■■

社員コードを入力して、削除ボタンをクリックすると、入力した社員コード
のエラーチェックをし、エラーが無ければ、社員テーブルから該当するレ
コードを削除します。

【社員テーブル】
---------------------------------------------
key  列 名   データ型    nullを許容
---------------------------------------------
○ 社員コード  nchar(5)       許容しない
− 社員氏名   nvarchar(20)   許容しない
− 社員カナ   nvarchar(40)   許容しない
− 更新日時   datetime       許容しない
---------------------------------------------

【部署テーブル】
---------------------------------------------
key  列 名   データ型    nullを許容
---------------------------------------------
○ 部署コード  nchar(4)       許容しない
− 部署名    nvarchar(20)   許容しない
− 更新日時   datetime       許容しない
---------------------------------------------

┏━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ 社員テーブル削除              _□×┃
┣━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃  Label1    TxtShainCode   BtnRetrieval
┃┌―――――┐ ┌―――――┐   ┌――――┐
┃│社員コード│ │     │   │ 検索 │
┃└―――――┘ └―――――┘   └――――┘
┃  Label2    LblShainShimei
┃┌―――――┐ ┌――――――――┐
┃│社員氏名 │ │        │
┃└―――――┘ └――――――――┘
┃  Label3    LblShainKana
┃┌―――――┐ ┌――――――――――――――┐
┃│社員カナ │ │              │
┃└―――――┘ └――――――――――――――┘
┃  Label4    LblBushoMei
┃┌―――――┐ ┌――――――┐
┃│部署   │ │      │
┃└―――――┘ └――――――┘
┃ BtnDelete    BtnClear
┃┌――――┐  ┌―――――┐
┃│ 削除 │  │ クリア │
┃└――――┘  └―――――┘
┗━━━━━━━━━━━━━━━━━━━━━━━━━━┛

接続文字列は、app.configに登録しておきます。

  <connectionStrings>
      <add name="AdoNet.My.MySettings.sampleDBConStr" .......... />
  </connectionStrings>

====================================================================
【画面クラスの主な改良修正点】

画面クラスからは、テーブルアクセスクラスのメンバーを呼び出さないよう
に修正しました。


--【プログラムソースリスト(FormDelete.vb)】-----------------------

Option Strict On

'////////// 社員マスター削除画面クラス //////////
Public Class FormDelete

    '----------<< フォームロード処理 >>----------
    Private Sub FormDelete_Load(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles Mybase.Load

        ' 画面初期設定
        Me.ClearForm()

    End Sub

    '----------<< 検索ボタン押下処理 >>----------
    Private Sub BtnRetrieval_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles BtnRetrieval.Click

        Try
            ' 社員データ削除クラスのインスタンス生成
            Dim shain As New ClsDeleteShain(Me.TxtShainCode.Text)
            Me.LblShainShimei.Text = shain.ShainShimei
            Me.LblShainKana.Text = shain.ShainKana

            ' 部署データ選択クラスのインスタンス生成
            Dim busho As New ClsSelectBusho(shain.BushoCode)
            Me.LblBushoMei.Text = busho.BushoMei

            ' 社員コード・検索ボタン入力不可
            Me.TxtShainCode.Enabled = False
            Me.BtnRetrieval.Enabled = False
            Me.BtnDelete.Enabled = True
            ' 削除ボタンにフォーカス
            Me.BtnDelete.Focus()

        Catch ex As myShainCodeException
            ' 社員コードエラー
            MessageBox.Show(ex.Message, "社員コードエラー")
            Me.TxtShainCode.Focus()

        Catch ex As myDBIOException
            ' DBアクセスクラス独自例外発生時
            MessageBox.Show(ex.Message, "DBIO例外発生")

        Catch ex As Exception
            ' その他例外発生時
            MessageBox.Show(ex.ToString, "例外発生")

        End Try

    End Sub

    '----------<< 削除ボタン押下処理 >>----------
    Private Sub BtnDelete_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles BtnDelete.Click

        Try
            ' 社員マスターレコード削除処理
            Dim shain As New ClsDeleteShain
            shain.DeleteKeyRecord(Me.TxtShainCode.Text)

            ' 画面初期設定
            Me.ClearForm()

            ' 正常終了
            MessageBox.Show("正常に削除されました", "削除処理")

        Catch ex As myDBIOException
            ' DBアクセスクラス独自例外発生時
            MessageBox.Show(ex.Message, "DBアクセスエラー")

        Catch ex As Exception
            ' その他例外発生時
            MessageBox.Show(ex.ToString, "例外発生")

        End Try

    End Sub

    '----------<< クリアボタン押下処理 >>----------
    Private Sub BtnClear_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles BtnClear.Click

        ' 画面初期設定
        Me.ClearForm()
        ' 社員コードにフォーカス
        Me.TxtShainCode.Focus()

    End Sub

    '----------<< 画面初期設定 >>----------
    Private Sub ClearForm()

        Me.TxtShainCode.Text = Nothing
        Me.LblShainShimei.Text = Nothing
        Me.LblShainKana.Text = Nothing
        Me.LblBushoMei.Text = Nothing

        ' 社員コード・検索ボタン入力不可
        Me.TxtShainCode.Enabled = True
        Me.BtnRetrieval.Enabled = True
        Me.BtnDelete.Enabled = False

    End Sub

End Class


====================================================================
【社員データクラス】

派生クラスで、引数なしのコンストラクタのほかに、引数に社員コードを指
定するコンストラクタを追加しました。


--【プログラムソースリスト(ClsShain.vb)】-------------------------

Option Strict On
Imports System.Text.RegularExpressions

'////////// 基本クラス:社員データクラス //////////
Public MustInherit Class ClsShainBase

    '----------<< メンバ:変数 >>----------
    Protected shainCodeValue As String
    Private shainShimeiValue As String
    Private shainKanaValue As String
    Private bushoCodeValue As String
    Protected koushinNichijiValue As DateTime

    '--------------------------------------------------------
    ' 機能:コンストラクタ
    ' 引数:なし
    '----1---------2---------3---------4---------5----------6
    Protected Sub New()

        MyBase.New()   ' 基本クラスのコンストラクタを呼び出す

    End Sub

    '--------------------------------------------------------
    ' プロパティ:社員氏名
    '--------------------------------------------------------
    Public Property ShainShimei() As String

        ' Getプロパティ
        Get
            Return shainShimeiValue
        End Get

        ' Setプロパティ
        Set(ByVal value As String)
            ' 【エラーチェック】
            If value.Length = 0 Then
                ' 未入力はエラー
                Throw New myShainShimeiException _
                ("社員氏名を入力してください")
            Else
                shainShimeiValue = 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.Length = 0 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.Length = 0 Then
                ' 未入力はエラー
                Throw New myBushoCodeException _
                ("部署コードを入力してください")
            Else
                ' 数字なら正常
                If Regex.IsMatch(value, "^[0-9]+$") Then
                    Dim dbIO As New ClsBushoTableIO

                    ' 部署マスタにあれば正常
                    If dbIO.ExistKeyData(value) = True Then
                        bushoCodeValue = value
                    Else
                        Throw New myBushoCodeException _
                          ("部署コードはありません")
                    End If
                Else
                    Throw New myBushoCodeException _
                      ("部署コードに数字以外の文字があります")
                End If
            End If
        End Set

    End Property

    '--------------------------------------------------------
    ' プロパティ:更新日時
    '--------------------------------------------------------
    Public ReadOnly Property KoushinNichiji() As DateTime

        ' Getプロパティ
        Get
            Return koushinNichijiValue
        End Get

    End Property

    '**********************************************************
    ' 機能:社員テーブルの行データ生成
    ' 引数:なし
    ' 返値:生成した行データ
    '******1*********2*********3*********4*********5**********6
    Public Function CreateDataRow() As DataRow

        Dim retRow As DataRow              ' リターン値
        Dim dbIO As New ClsShainTableIO

        retRow = dbIO.CreateDataRow()

        Return retRow

    End Function

End Class

'//////// サブ抽象クラス:社員データ選択更新削除クラス ////////
Public MustInherit Class ClsShainSub
    Inherits ClsShainBase

    '=======================================================
    ' 機能:コンストラクタ
    ' 引数:なし
    '=======================================================
    Protected Sub New()

        MyBase.New()   ' 基本クラスのコンストラクタを呼び出す

    End Sub

    '=======================================================
    ' 機能:コンストラクタ
    ' 引数:社員コード
    '=======================================================
    Protected Sub New(ByVal shainCode As String)

        MyBase.New()  ' 基本クラスのコンストラクタを呼び出す

        ' ---<< 社員テーブルからレコード取得 >>---
        Dim shainTable As New ClsShainTableIO
        Dim dt As DataTable

        ' レコード取得メソッド呼出
        dt = shainTable.GetKeyData(shainCode)
        If dt.Rows.Count = 1 Then
            ' レコードがあった時
            MyBase.ShainCodeValue = shainCode
            MyBase.ShainShimei = CStr(dt.Rows(0)("社員氏名"))
            MyBase.ShainKana = CStr(dt.Rows(0)("社員カナ"))
            MyBase.BushoCode = CStr(dt.Rows(0)("部署コード"))
            MyBase.KoushinNichijiValue = _
            CDate(dt.Rows(0)("更新日時"))
        Else
            ' レコードが無かった時
            Throw New myShainCodeException _
            ("社員テーブルにレコードがありません")
        End If

    End Sub

    '--------------------------------------------------------
    ' プロパティ:社員コード
    '--------------------------------------------------------
    Public ReadOnly Property ShainCode() As String

        ' Getプロパティ
        Get
            Return shainCodeValue
        End Get

    End Property

End Class

'////////// 派生クラス:社員データ削除クラス //////////
Public Class ClsDeleteShain
    Inherits ClsShainSub

    '========================================================
    ' 機能:コンストラクタ
    ' 引数:なし
    '========================================================
    Public Sub New()

        MyBase.New()

    End Sub

    '========================================================
    ' 機能:コンストラクタ
    ' 引数:社員コード
    '========================================================
    Public Sub New(ByVal shainCode As String)

        MyBase.New(shainCode)

    End Sub

    '********************************************************
    ' 機能:社員テーブルの1レコードを削除するメソッド
    ' 引数:削除するレコードの社員コード
    ' 戻値:削除したレコード数
    '****1*********2*********3*********4*********5**********6
    Public Function _
        DeleteKeyRecord(ByVal shainCode As String) As Integer

        Dim retDeleteCount As Integer    ' リターン値
        Dim dbIO As New ClsShainTableIO()

        ' レコードの削除
        retDeleteCount = dbIO.DeleteKeyRecord(shainCode)

        Return retDeleteCount

    End Function

End Class


====================================================================
【sampleDBアクセスクラスの改良修正点】

Try … Catch … End Try をはずして、エラー発生時はそのまま例外をス
ローするように修正しました。


--【プログラムソースリスト(ClsSampleDBIO.vb)】--------------------

Option Strict On
Imports System.Configuration       ' [参照の削除]から削除
Imports System.Data.SqlClient
Imports System.Transactions        ' [参照の削除]から削除

'////////// 基本クラス:sampleDBアクセスクラス //////////
Public MustInherit Class ClsSampleDBIO

    '==========================================================
    ' 機能:コンストラクタ
    ' 引数:なし
    '==========================================================
    Public Sub New()

        MyBase.New()

    End Sub

    '**********************************************************
    ' 機能:テーブルキー値のレコードの有無を調べるメソッド
    ' 引数:テーブル名
    ' 引数:キーフィールド名
    ' 引数:主キー値
    ' 戻値:レコードあり-->True、レコードなし-->False
    ' 補足:主キーフィールドはNChar型とする
    '******1*********2*********3*********4*********5**********6
    Public Function ExistKeyData(ByVal tableName As String, _
                                 ByVal keyField As String, _
                                 ByVal keyCode As String) _
                                 As Boolean

        Dim retExist As Boolean      ' リターン値

        Using con As New SqlConnection
            Using cmd As New SqlCommand
                ' 接続関連プロパティ設定
                Me.SetConnection(con, cmd)

                ' SQL文設定
                cmd.CommandText = "SELECT COUNT(*) FROM " & _
                tableName & _
                " WHERE " & keyField & " = @KeyCode"

                ' SQL文の引数設定
                cmd.Parameters.Clear()
                ' パラメータの実際のサイズからデータ長を推論
                cmd.Parameters.Add("@KeyCode", SqlDbType.NChar)
                ' コマンド引数に値を設定
                cmd.Parameters("@KeyCode").Value = keyCode

                ' DB接続を開く
                con.Open()

                ' レコード件数取得
                Dim count As Integer = CInt(cmd.ExecuteScalar())

                If count = 1 Then
                    ' レコードが1件あれば、Trueを返す
                    retExist = True
                Else
                    ' そうでなければ、Falseを返す
                    retExist = False
                End If

            End Using
        End Using

        ' ◆戻値を設定してリターン
        Return retExist

    End Function

    '**********************************************************
    ' 機能:引数に指定したテーブルのキー値のレコードを取得する
    ' 引数:テーブル名
    ' 引数:キーフィールド名
    ' 引数:主キー値
    ' 戻値:取得したレコード
    ' 補足:テーブル名の主キーフィールドはNChar型とする
    '******1*********2*********3*********4*********5**********6
    Public Function GetKeyData(ByVal tableName As String, _
                               ByVal keyField As String, _
                               ByVal keyCode As String) _
                               As DataTable

        Dim retDt As New DataTable    'リターン値

        '----------<< テーブルからレコード取得 >>----------
        Using con As New SqlConnection
            Using cmd As New SqlCommand
                ' 接続関連プロパティ設定
                Me.SetConnection(con, cmd)

                ' SQL文設定
                cmd.CommandText = "SELECT * FROM " & _
                tableName & _
                " WHERE " & keyField & " = @keyCode"

                ' SQL文の引数設定
                cmd.Parameters.Clear()
                ' パラメータの実際のサイズからデータ長を推論
                cmd.Parameters.Add("@keyCode", SqlDbType.NChar)
                ' コマンド引数に値を設定
                cmd.Parameters("@KeyCode").Value = keyCode

                ' レコード取得
                Dim da As New SqlDataAdapter
                da.SelectCommand = cmd
                da.Fill(retDt)

            End Using
        End Using

        ' ◆戻値を設定してリターン
        Return retDt

    End Function

    '**********************************************************
    ' 機能:引数に指定したテーブルのキー値のレコードを削除する
    ' 引数:テーブル名
    ' 引数:キーフィールド名
    ' 引数:主キー値
    ' 戻値:削除したレコード数
    ' 補足:テーブル名の主キーフィールドはNChar型とする
    '******1*********2*********3*********4*********5**********6
    Public Function _
        DeleteKeyData(ByVal tableName As String, _
                      ByVal keyField As String, _
                      ByVal keyCode As String) As Integer

        Dim retDeleteCount As Integer    'リターン値

        '----------<< レコード削除 >>----------
        ' トランザクション開始
        Using tran As New TransactionScope
            Using con As New SqlConnection
                Using cmd As New SqlCommand
                    ' 接続関連プロパティ設定
                    Me.SetConnection(con, cmd)

                    ' SQL文設定
                    cmd.CommandText = "DELETE FROM " & tableName & _
                    " WHERE " & keyField & " = @keyCode"

                    ' SQL文の引数設定
                    cmd.Parameters.Clear()
                    ' パラメータの実際のサイズからデータ長を推論
                    cmd.Parameters.Add("@keyCode", SqlDbType.NChar)
                    ' コマンド引数に値を設定
                    cmd.Parameters("@KeyCode").Value = keyCode

                    ' DB接続を開く
                    con.Open()

                    ' レコード削除を実行
                    retDeleteCount = cmd.ExecuteNonQuery()

                End Using
            End Using

            If retDeleteCount = 1 Then
                ' 1レコード削除なら正常(通常これしかありえない)
                ' トランザクション完了(コミット)
                tran.Complete()
            Else
                ' 1レコード削除以外なら例外をスロー
                ' コミットしなければ、自動的にロールバックされる
                Throw New myDBIOException _
                    ("エラー:削除処理に失敗")
            End If

        End Using

        ' ◆戻値を設定してリターン
        Return retDeleteCount

    End Function

    '**********************************************************
    ' 機能:社員テーブルの行データ生成
    ' 引数:テーブル名
    ' 引数:キーフィールド名
    ' 戻値:生成した行データ
    '******1*********2*********3*********4*********5**********6
    Public Function CreateDataRow(ByVal tableName As String, _
                                  ByVal keyField As String) _
                                  As DataRow

        Dim retRow As DataRow            ' リターン値
        Dim dt As New DataTable

        ' 列情報を取込むために、レコードを取得するが
        ' 取得できなくてもよいので、第三引数のキー値は何でも良い
        dt = Me.GetKeyData(tableName, keyField, "_")
        retRow = dt.NewRow

        Return retRow

    End Function

    '**********************************************************
    ' 機能:接続関連プロパティ設定
    ' 引数:参照 SqlConnectionオブジェクト
    ' 引数:参照 SqlCommandオブジェクト
    ' 戻値:なし
    '******1*********2*********3*********4*********5**********6
    Public Sub SetConnection(ByRef con As SqlConnection, _
                             ByRef cmd As SqlCommand)

        Dim settings As ConnectionStringSettings

        ' 接続文字列をapp.configファイルから取得
        settings = _
        ConfigurationManager.ConnectionStrings _
        ("AdoNet.My.MySettings.sampleDBConStr")

        If settings Is Nothing Then
            ' 接続文字列取得エラー
            Throw New Exception _
            ("接続文字列がapp.configに未登録")
        Else
            ' 接続文字列の設定
            con.ConnectionString = settings.ConnectionString

            ' SqlCommand.Connectionプロパティの設定
            cmd.Connection = con
        End If

    End Sub

End Class


====================================================================
【社員テーブルアクセスクラスの改良修正点】

このクラスも、Try … Catch … End Try をはずして、エラー発生時はそ
のまま例外をスローするように修正しました。


--【プログラムソースリスト(ClsShainTableIO.vb)】------------------

Option Strict On
Imports System.Data.SqlClient
Imports System.Text.RegularExpressions
Imports System.Transactions            ' [参照の追加]で追加

Public Class ClsShainTableIO
    Inherits ClsSampleDBIO

    '==========================================================
    ' 機能:コンストラクタ
    ' 引数:なし
    '==========================================================
    Public Sub New()

        MyBase.New()

    End Sub

    '**********************************************************
    ' 機能:社員テーブル主キー値レコードの有無を調べるメソッド
    ' 引数:社員コード
    ' 戻値:レコードあり --> True、レコードなし --> False
    '******1*********2*********3*********4*********5**********6
    Public Overloads Function _
        ExistKeyData(ByVal shainCode As String) As Boolean

        Dim retExist As Boolean       ' リターン値

        ' 引数の空文字列チェック
        If shainCode.Length = 0 Then
            Throw New myShainCodeException _
            ("社員コードが未入力")
        End If

        ' キー値文字チェック(キー値は数字のみで構成されている)
        If Not Regex.IsMatch(shainCode, "^[0-9]+$") Then
            ' 数字以外はエラー
            Throw New myShainCodeException _
            ("社員コードに数字以外の文字があります")
        End If

        ' キー値長さチェック(社員コードは5桁)
        If Not shainCode.Length = 5 Then
            ' 5桁以外はエラー
            Throw New myShainCodeException _
            ("社員コードの桁数が正しくない")
        End If

        ' 社員テーブルに引数のレコードが存在するかチェックする
        retExist = MyBase.ExistKeyData _
            ("社員テーブル", "社員コード", shainCode)

        ' ◆戻値を設定してリターン
        Return retExist

    End Function

    '**********************************************************
    ' 機能:引数のレコードを社員テーブルから取得する
    ' 引数:社員コード
    ' 戻値:引数に指定した社員コードのレコード
    '******1*********2*********3*********4*********5**********6
    Public Overloads Function _
        GetKeyData(ByVal shainCode As String) As DataTable

        Dim retDt As New DataTable   ' リターン値

        ' 引数の空文字列チェック
        If shainCode.Length = 0 Then
            Throw New myShainCodeException _
            ("社員コードが未入力")
        End If

        ' キー値文字チェック(キー値は数字のみで構成されている)
        If Not Regex.IsMatch(shainCode, "^[0-9]+$") Then
            ' 数字以外はエラー
            Throw New myShainCodeException _
            ("社員コードに数字以外の文字があります")
        End If

        ' キー値長さチェック(社員コードは5桁)
        If Not shainCode.Length = 5 Then
            ' 5桁以外はエラー
            Throw New myShainCodeException _
            ("社員コードの桁数が正しくない")
        End If

        ' 社員テーブルから引数コードのレコードを取得する
        retDt = MyBase.GetKeyData _
            ("社員テーブル", "社員コード", shainCode)

        ' ◆戻値を設定してリターン
        Return retDt

    End Function

    '**********************************************************
    ' 機能:社員テーブルから1レコードを削除するメソッド
    ' 引数:削除する社員コード
    ' 戻値:削除したレコード数
    '******1*********2*********3*********4*********5**********6
    Public Overloads Function _
        DeleteKeyRecord(ByVal shainCode As String) As Integer

        Dim retDeleteCount As Integer    ' リターン値

        ' キー値のレコード存在チェック
        If Me.ExistKeyData(shainCode) = True Then
            ' レコードが存在すれば削除
            retDeleteCount = MyBase.DeleteKeyData _
                ("社員テーブル", "社員コード", shainCode)
        Else
            ' レコードが存在しなければ例外をスロー
            Throw New myDBIOException _
                ("社員コードのレコードが存在しません")
        End If

        ' ◆戻値を設定してリターン
        Return retDeleteCount

    End Function

    '**********************************************************
    ' 機能:社員マスターの行データ生成
    ' 引数:なし
    ' 戻値:生成した行データ
    '******1*********2*********3*********4*********5**********6
    Public Overloads Function CreateDataRow() As DataRow

        Dim retRow As DataRow            ' リターン値

        retRow = MyBase.CreateDataRow("社員テーブル", "社員コード")

        Return retRow

    End Function

End Class


====================================================================
【部署データ管理クラスの追加】

部署データ管理クラスを新規に作成しました。


--【プログラムソースリスト(ClsBusho.vb)】------------------

Option Strict On
Imports System.Text.RegularExpressions

'////////// 基本クラス:部署データクラス //////////
Public MustInherit Class ClsBushoBase

    '----------<< メンバ:変数 >>----------
    Protected bushoCodeValue As String
    Private bushoMeiValue As String
    Protected koushinNichijiValue As DateTime

    '========================================================
    ' 機能:コンストラクタ
    ' 引数:なし
    '========================================================
    Protected Sub New()

        MyBase.New()   ' 基本クラスのコンストラクタを呼び出す

    End Sub

    '--------------------------------------------------------
    ' プロパティ:部署名
    '--------------------------------------------------------
    Public Property BushoMei() As String

        ' Getプロパティ
        Get
            Return bushoMeiValue
        End Get

        ' Setプロパティ
        Set(ByVal value As String)
            ' 【エラーチェック】
            If value.Length = 0 Then
                ' 未入力はエラー
                Throw New myBushoMeiException _
                ("部署名を入力してください")
            Else
                BushoMeiValue = value
            End If
        End Set

    End Property

    '--------------------------------------------------------
    ' プロパティ:更新日時
    '--------------------------------------------------------
    Public ReadOnly Property KoushinNichiji() As DateTime

        ' Getプロパティ
        Get
            Return koushinNichijiValue
        End Get

    End Property

End Class

'//////// 派生抽象クラス:部署データ選択更新削除クラス ////////
Public MustInherit Class ClsBushoSub
    Inherits ClsBushoBase

    '=======================================================
    ' 機能:コンストラクタ
    ' 引数:なし
    '=======================================================
    Protected Sub New()

        MyBase.New()   ' 基本クラスのコンストラクタを呼び出す

    End Sub

    '=======================================================
    ' 機能:コンストラクタ
    ' 引数:部署コード
    '=======================================================
    Protected Sub New(ByVal bushoCode As String)

        MyBase.New()  ' 基本クラスのコンストラクタを呼び出す

        ' ---<< 部署テーブルからレコード取得 >>---
        Dim bushoTable As New ClsBushoTableIO
        Dim dt As DataTable

        ' レコード取得メソッド呼出
        dt = bushoTable.GetKeyData(bushoCode)
        If dt.Rows.Count = 1 Then
            ' レコードがあった時
            MyBase.BushoCodeValue = bushoCode
            MyBase.BushoMei = CStr(dt.Rows(0)("部署名"))
            MyBase.KoushinNichijiValue = _
                CDate(dt.Rows(0)("更新日時"))
        Else
            ' レコードが無かった時
            Throw New myBushoCodeException _
            ("部署テーブルにレコードがありません")
        End If

    End Sub

    '--------------------------------------------------------
    ' プロパティ:部署コード
    '--------------------------------------------------------
    Public ReadOnly Property BushoCode() As String

        ' Getプロパティ
        Get
            Return bushoCodeValue
        End Get

    End Property

End Class

'//////// 派生クラス:部署データ選択クラス ////////
Public Class ClsSelectBusho
    Inherits ClsBushoSub

    Private bushoDataValue As DataTable

    '=======================================================
    ' 機能:コンストラクタ
    ' 引数:なし
    '=======================================================
    Public Sub New(ByVal bushoCode As String)

        MyBase.New(bushoCode)

    End Sub

    ' 削除処理では不要のため以下省略

End Class


====================================================================
【部署テーブルアクセスクラスの追加】

部署テーブルアクセスクラスを新規に作成しました。


--【プログラムソースリスト(ClsBushoTableIO.vb)】------------------

Option Strict On
Imports System.Data.SqlClient
Imports System.Text.RegularExpressions
Imports System.Transactions            ' [参照の追加]で追加

'////////// 派生クラス:部署テーブルアクセスクラス //////////
Public Class ClsBushoTableIO
    Inherits ClsSampleDBIO

    '==========================================================
    ' 機能:コンストラクタ
    ' 引数:なし
    '==========================================================
    Public Sub New()

        MyBase.New()

    End Sub

    '**********************************************************
    ' 機能:キー値のレコードの有無を調べるメソッド
    ' 引数:部署コード
    ' 戻値:レコードあり-->True、レコードなし-->False
    ' 補足:主キーフィールドはNChar型とする
    '******1*********2*********3*********4*********5**********6
    Public Overloads Function _
        ExistKeyData(ByVal bushoCode As String) As Boolean

        Dim retExist As Boolean    ' リターン値

        ' 引数の空文字列チェック
        If bushoCode.Length = 0 Then
            Throw New myBushoCodeException _
            ("部署コードが未入力です")
        End If

        ' キー値文字チェック(キー値は数字のみで構成されている)
        If Not Regex.IsMatch(bushoCode, "^[0-9]+$") Then
            ' 数字以外はエラー
            Throw New myBushoCodeException _
            ("部署コードに数字以外の文字があります")
        End If

        ' キー値長さチェック(部署コードは4桁)
        If Not bushoCode.Length = 4 Then
            ' 4桁以外はエラー
            Throw New myBushoCodeException _
            ("部署コードの桁数が正しくない")
        End If

        ' 引数のレコードの有無をチェックする
        retExist = MyBase.ExistKeyData _
            ("部署テーブル", "部署コード", bushoCode)

        ' ◆戻値を設定してリターン
        Return retExist

    End Function

    '**********************************************************
    ' 機能:引数のレコードを部署テーブルから取得する
    ' 引数:部署コード
    ' 戻値:引数に指定した部署コードのレコード(DataTble型)
    ' 補足:主キーフィールドはNChar型とする
    '******1*********2*********3*********4*********5**********6
    Public Overloads Function _
        GetKeyData(ByVal bushoCode As String) As DataTable

        Dim retDt As New DataTable   ' リターン値

        ' 引数の空文字列チェック
        If bushoCode.Length = 0 Then
            Throw New mybushoCodeException _
            ("部署コードが未入力")
        End If

        ' キー値文字チェック(キー値は数字のみで構成されている)
        If Not Regex.IsMatch(bushoCode, "^[0-9]+$") Then
            ' 数字以外はエラー
            Throw New mybushoCodeException _
            ("部署コードに数字以外の文字があります")
        End If

        ' キー値長さチェック(部署コードは4桁)
        If Not bushoCode.Length = 4 Then
            ' 4桁以外はエラー
            Throw New mybushoCodeException _
            ("部署コードの桁数が正しくない")
        End If

        ' 部署テーブルから引数コードのレコードを取得する
        retDt = MyBase.GetKeyData _
            ("部署テーブル", "部署コード", bushoCode)

        ' ◆戻値を設定してリターン
        Return retDt

    End Function

    ' 削除処理では不要のため以下省略

End Class


--------------------------------------------------------------------
次号から注文伝票入力を始めます。ヘッダーとデータグリッドビューを使っ
た明細行の入力、注文テーブルと明細テーブルへの登録を予定しています。

====================================================================
                           【お詫び】
70号と71号に掲載漏れがありました。皆様にお詫び申し上げます。

<< 前の号 目次 最新号 >>

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