すぐ使えるADO.NET

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

本の紹介

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

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




【第69号】

第69号(2009.2.5発行)
====================================================================
        ★★ -- 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       許容しない
---------------------------------------------

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

┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ 社員テーブル検索               _□×┃
┣━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃  Label1    TxtShainCode   BtnRetrieval
┃┌―――――┐ ┌―――――┐  ┌――――┐
┃│社員コード│ │     │  │ 検索 │
┃└―――――┘ └―――――┘  └――――┘
┃  Label2    LblShainShimei
┃┌―――――┐ ┌――――――――┐
┃│社員氏名 │ │        │
┃└―――――┘ └――――――――┘
┃  Label3    LblShainKana
┃┌―――――┐ ┌――――――――┐
┃│社員カナ │ │        │
┃└―――――┘ └――――――――┘
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
接続文字列は、app.configに登録しておきます。

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

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

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


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

'////////// 社員テーブル検索画面クラス //////////
Public Class FormSelect

    Private shain As ClsSelectShain

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

        Try
            ' 社員データ選択クラスのインスタンス生成
            Me.shain = New ClsSelectShain(Me.TxtShainCode.Text)
            Me.LblShainShimei.Text = Me.shain.ShainShimei
            Me.LblShainKana.Text = Me.shain.ShainKana

        Catch ex As myShainCodeException
            ' 社員コードエラー
            Me.LblShainShimei.Text = Nothing
            Me.LblShainKana.Text = Nothing
            MessageBox.Show(ex.Message, "入力エラー")
            Me.TxtShainCode.Focus()

        Catch ex As myDBIOException
            ' DBIO独自例外発生時
            MessageBox.Show(ex.Message, "DBIO例外発生")

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

        End Try

    End Sub

End Class
====================================================================
【社員データ基本クラスの主な改良修正点】

外部から値をセットする必要のない更新日時プロパティをReadOnlyにして、
Setプロパティを削除しました。

サブクラスでのアクセス方法が異なるため、社員コードプロパティ宣言は削
除して、各サブクラスで実装することにしました。

--【プログラムソースリスト(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
    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 ReadOnly Property KoushinNichiji() As DateTime

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

    End Property

End Class


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

コンストラクタの引数に社員コードを指定して、社員テーブルアクセスクラ
スのメソッドを呼び出すように修正しました。また社員コードプロパティを、
ReadOnlyに変更しました。


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

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

    '=======================================================
    ' 機能:コンストラクタ
    ' 引数:社員コード
    '=======================================================
    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.ShainShimei = CStr(dt.Rows(0)("社員氏名"))
            MyBase.ShainKana = 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


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

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


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

'////////// 派生クラス:社員データ選択クラス //////////
Public Class ClsSelectShain
    Inherits ClsShainSub

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

        MyBase.New(shainCode)

    End Sub

End Class


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

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


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

Option Strict On
Imports System.Data.SqlClient
Imports System.Configuration  '[参照の追加]から追加

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

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

      MyBase.New()

  End Sub

  '**********************************************************
  ' 機能:引数に指定したテーブルのキー値のレコードを取得する
  ' 引数:テーブル名
  ' 引数:キーフィールド名
  ' 引数:主キー値
  ' 戻値:取得したレコード
  ' 補足:テーブル名の主キーフィールドはNChar型とする
  '******1*********2*********3*********4*********5**********6
  Public Function GetKeyData(ByVal tableName As String, _
                             ByVal keyField As String, _
                             ByVal keyValue 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 & " = @keyValue"

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

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

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

  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.sampleDBConnectionString")

      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.Text.RegularExpressions

'////////// 派生クラス:社員テーブルアクセスクラス //////////
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    ' リターン値

      ' 引数Nothing(未設定)・空白チェック
      If shainCode.Length = 0 Then
          Throw New myShainCodeException _
          ("エラー:社員コードが未入力")
      End If

      ' 引数の前後の空白は除去する
      shainCode = shainCode.Trim()
      ' キー値文字チェック(キー値は英数字のみで構成されている)
      If Not Regex.IsMatch(shainCode, "^[0-9a-zA-Z]+$") 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

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.