すぐ使えるADO.NET

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

本の紹介

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

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




【第71号】

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

すぐ使えるADO.NET --> http://park5.wakwak.com/‾weblab/
--------------------------------------------------------------------
                          【お知らせ】

マスター保守修正版が完了したら、注文伝票入力を始めます。注文伝票入力
では、ヘッダーとデータグリッドビューを使った明細行の入力、注文テーブ
ル(ヘッダーデータ)と注文明細テーブルへの登録などを予定しています。

====================================================================
         ■■ マスターテーブル保守改良版 テーブル更新 ■■

マスター保守のプログラムは完成しましたが、現在見直し中です。今回は、
見直しが終わったマスターテーブル更新【修正版】の、ソースリストを掲載
します。

主な修正点は、テーブル追加と同様に、フォームクラスでの開発負担を軽減
するために、フォームクラスから、テーブルアクセスクラスのメンバーを呼
び出さないで済むようにした点です。

お手数ですが、下記のソースリストと置き換えをお願いします。

--------------------------------------------------------------------
                  ■■ 社員テーブルを更新する ■■

検索ボタンをクリックすると、入力した社員コードのエラーチェックをして、
エラーが無ければ、社員テーブルから該当レコードを取得し、社員氏名と社
員カナを表示します。

更新ボタンをクリックすると、変更した社員氏名と社員カナのエラーチェッ
クをして、エラーが無ければ、社員テーブルの該当レコードを更新します。

クリアボタンをクリックすると、社員コードと検索ボタンのEnableプロパ
ティをTrue、他はFalseにして、入出力項目を初期状態に戻します。

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

◆新規にプロジェクトを作成して、フォームに下記のコントロールを貼り付
けてください。

┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ 社員テーブル更新               _□×┃
┣━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃  Label1    TxtShainCode   BtnRetrieval
┃┌―――――┐ ┌―――――┐   ┌――――┐
┃│社員コード│ │     │   │ 検索 │
┃└―――――┘ └―――――┘   └――――┘
┃  Label2    TxtShainShimei
┃┌―――――┐ ┌――――――――┐
┃│社員氏名 │ │        │
┃└―――――┘ └――――――――┘
┃  Label3    TxtShainKana
┃┌―――――┐ ┌――――――――――――――┐
┃│社員カナ │ │              │
┃└―――――┘ └――――――――――――――┘
┃  Label4    CboBushoMei
┃┌―――――┐ ┌―――――――――┬―┐
┃│部署   │ │         │▼│
┃└―――――┘ └―――――――――┴―┘
┃ BtnUpdate    BtnClear
┃┌――――┐  ┌―――――┐
┃│ 更新 │  │ クリア │
┃└――――┘  └―――――┘
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

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

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

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

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


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

'////////// 社員テーブル更新画面クラス //////////
Option Strict On

Public Class FormUpdate

    Private shain As ClsUpdateShain
    Private busho As ClsSelectBusho

    '----------<< フォームロード処理 >>----------
     Private Sub FormUpdate_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
            ' 社員データ更新クラスのインスタンス生成
            Me.shain = New ClsUpdateShain(Me.TxtShainCode.Text)
            Me.TxtShainShimei.Text = Me.shain.ShainShimei
            Me.TxtShainKana.Text = Me.shain.ShainKana

            ' 部署データ選択クラスのインスタンス生成
            Me.busho = New ClsSelectBusho(Me.shain.BushoCode)
            ' 取得した部署名にインデックスを設定
            Me.CboBushoMei.SelectedIndex _
            = Me.CboBushoMei.FindString(Me.busho.BushoMei)

            ' 社員コード・検索ボタン入力不可
            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, "社員コードエラー")
            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 BtnUpdate_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles BtnUpdate.Click

        Try
            ' 社員テーブルのデータ行生成
            Dim row As DataRow
            row = shain.CreateDataRow()

            ' 画面データのセット
            row("社員コード") = Me.TxtShainCode.Text
            row("社員氏名") = Me.TxtShainShimei.Text
            row("社員カナ") = Me.TxtShainKana.Text
            row("部署コード") = CStr(Me.CboBushoMei.SelectedValue)

            ' 社員テーブルの更新処理
            shain.UpdateKeyRecord(row)

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

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

        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 myBushoCodeException
            ' 部署コードエラー
            MessageBox.Show(ex.Message, "部署コードエラー")
            Me.CboBushoMei.Focus()

        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.TxtShainShimei.Text = Nothing
        Me.TxtShainKana.Text = Nothing

        ' 部署テーブルの全レコード取得
        Me.busho = New ClsSelectbusho()
        ' コンボボックスに部署名を表示できるようにする
        Me.CboBushoMei.DisplayMember = "部署名"
        ' 部署コードをSelectdValueで取得できるようにする
        Me.CboBushoMei.ValueMember = "部署コード"
        ' コンボボックスにデータを連結する
        Me.CboBushoMei.DataSource = Me.busho.BushoData

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

    End Sub

End Class


====================================================================
【社員データ基本クラス】
【社員データ選択更新削除クラス】

前号(71号)に掲載しました。そちらを参考にしてください。


====================================================================
【社員データ更新クラスの主な改良修正点】

社員データ選択更新削除クラスで、コンストラクタの引数に社員コードを指
定するように変更したため、社員データ更新クラスのコンストラクタも、引
数に社員コードを指定します。


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

'////////// 派生クラス:社員データ更新クラス //////////
Public Class ClsUpdateShain
    Inherits ClsShainSub

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

        MyBase.New(shainCode)

    End Sub

    '********************************************************
    ' 機能:社員テーブルの1レコードを更新するメソッド
    ' 引数:更新する行データ
    ' 戻値:更新したレコード数
    '****1*********2*********3*********4*********5**********6
    Public Function _
        UpdateKeyRecord(ByVal shain As DataRow) As Integer

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

        ' エラーチェックとデータセット
        MyBase.ShainShimei = CStr(shain("社員氏名"))
        MyBase.ShainKana = CStr(shain("社員カナ"))
        MyBase.BushoCode = CStr(shain("部署コード"))

        ' レコードの更新
        retUpdateCount = dbIO.UpdateKeyRecord(Me)

        Return retUpdateCount

    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

  '**********************************************************
  ' 機能:社員テーブルの行データ生成
  ' 引数:テーブル名
  ' 引数:キーフィールド名
  ' 戻値:生成した行データ
  '******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

  '**********************************************************
  ' 機能:引数のレコードを社員テーブルから取得する
  ' 引数:社員コード
  ' 戻値:引数に指定した社員コードのレコード
  '******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レコードを更新するメソッド
  ' 引数:ClsUpdateShainオブジェクト
  ' 戻値:更新したレコード数
  '******1*********2*********3*********4*********5**********6
  Public Function UpdateKeyRecord( _
      ByVal shain As ClsUpdateShain) As Integer

      Dim retUpdateCount As Integer    ' リターン値

      ' トランザクション開始
      Using tran As New TransactionScope
        Using con As New SqlConnection
          Using cmd As New SqlCommand
              ' 接続関連プロパティ設定
              MyBase.SetConnection(con, cmd)

              ' SQL文の作成
              cmd.CommandText = _
              "UPDATE 社員テーブル " & _
              "SET 社員氏名 = @shimei, 社員カナ = @kana, " & _
              "部署コード = @bCode, 更新日時 = @newDate " & _
              "WHERE 社員コード = @sCode AND 更新日時 = @date"

              ' SQL文引数に値を設定
              cmd.Parameters.Clear()
              cmd.Parameters.Add("@sCode", SqlDbType.NChar, 5)
              cmd.Parameters.Add("@shimei", SqlDbType.NVarChar, 20)
              cmd.Parameters.Add("@kana", SqlDbType.NVarChar, 40)
              cmd.Parameters.Add("@bCode", SqlDbType.NChar, 4)
              cmd.Parameters.Add("@newDate", SqlDbType.DateTime)
              cmd.Parameters.Add("@date", SqlDbType.DateTime)

              cmd.Parameters("@sCode").Value = shain.ShainCode
              cmd.Parameters("@shimei").Value = shain.ShainShimei
              cmd.Parameters("@kana").Value = shain.ShainKana
              cmd.Parameters("@bCode").Value = shain.BushoCode
              cmd.Parameters("@newDate").Value = dateTime.Now
              cmd.Parameters("@date").Value = Shain.KoushinNichiji

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

              ' テーブルの更新を実行
              retUpdateCount = cmd.ExecuteNonQuery()

          End Using
        End Using

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

      End Using

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

  End Function

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


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

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


--【プログラムソースリスト(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

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

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

        ' 部署テーブルから全レコード取得
        Dim bushoTable As New ClsBushoTableIO

        ' レコード取得メソッド呼出
        bushoDataValue = bushoTable.GetAllData( _
            New String() {"部署コード", "部署名"}, _
            "部署コード", True)
        If bushoDataValue.Rows.Count = 0 Then
            ' レコードが無かった時
            Throw New myBushoCodeException _
                ("部署テーブルにレコードがありません")
        End If

    End Sub

    '--------------------------------------------------------
    ' プロパティ:部署全レコード
    '--------------------------------------------------------
    Public ReadOnly Property BushoData() As DataTable

        ' Getプロパティ
        Get
            Return Me.bushoDataValue
        End Get

    End Property

End Class


--------------------------------------------------------------------
次号は、マスター保守(社員テーブル削除)の修正版です。

====================================================================
VB.NET データベースプログラミング奮闘記
  発行者:ウェブ実験室([email protected])
          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」「やさしいBV2008 ADO.NET」
などのホームページで公開しているソースプログラム・データの利用により
生じた損害等については、発行者は一切責任を負いません。ソースプログラ
ムの再利用は自由です。著作権は発行者が所有します。
このメールマガジン及び「すぐ使えるADO.NET」「やさしいBV2008 ADO.NET」
などホームページに掲載されている会社名・製品名等は、各社の登録商標ま
たは商標です。
====================================================================

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