マスター表検索メソッド [ADO.NET][VB 2013]

Visual Basic 2010/2008 やさしいADO.NET DBプログラム

   やさしいVB 2010 / 2008 ADO.NET

商品マスター検索の関数、社員マスターの検索の関数、得意先マスター検索の関数などをいくつか作れば分りますが、いくつも同様な関数を作ることになります。異なるところはSQL文に関係する部分です。関数の数が多いと修正するのも大変なことになります。

そこで商品マスター検索の関数を発展させて、複数のマスターテーブルでも利用できるようなデータベースアクセスクラスを作成して、マスター表検索メソッドを実装することにします。

DBアクセスクラスのメソッドを呼び出す

商品検索画面

レコード取得する部分を関数化してマスター表を検索するで作成したプログラムをさらに修正して、商品マスター表からレコードを取得する部分をクラスメソッド化します。

検索ボタンクリック処理の中で、レコード取得関数を呼び出す部分を、データベースアクセスクラスのレコード取得メソッドを呼び出すように修正します。

レコード取得メソッドを呼び出すときには、引数として、表(テーブル)名、キー列(フィールド)名、キー値を指定します。

Option Strict On
Imports System.Data.SqlClient
Imports System.Configuration    ' 参照の追加で System.Configuration を追加

Public Class RetrievalFuntion

    Private Sub BtnRetrieval_Click(ByVal sender As System.Object, _
      ByVal e As System.EventArgs) Handles BtnRetrieval.Click

      '-------------------------------------------------------------
      ' ■ 検索ボタンクリック処理 ■
      '-------------------------------------------------------------
      ' 商品マスター表からレコード取得
      Try
          Dim shohinTableIO As New ClsHanbaiKanriDBIO
          Dim dt As New DataTable
          dt = shohinTableIO.GetKeyData _
("商品マスター表","商品コード",TxtShohinCode.Text) If dt.Rows.Count = 1 Then ' レコードがあった時 LblShohinMei.Text = CStr(dt.Rows(0)("商品名称")) LblHanbaiTanka.Text = CStr(dt.Rows(0)("販売単価")) Else ' レコードが無かった時 LblShohinMei.Text = Nothing LblHanbaiTanka.Text = Nothing MessageBox.Show("データがありません","エラー") End If Catch ex As Exception MessageBox.Show(ex.ToString, "【例外発生】") End Try End Sub End Class

マスターテーブルアクセス関数を、レコード取得メソッドとして作り直します。

  • レコード取得メソッドは、表名、キー列名、キー値を引数として受け取る
  • エラーがあれば例外をスロー
Option Strict On
Imports System.Data.SqlClient
Imports System.Configuration  '[参照の追加]から追加

'//////////// 販売管理データベースアクセスクラス ////////////
Public Class ClsHanbaiKanriDBIO

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

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

      Dim retDt As New DataTable    'リターン値

      ' 接続文字列をapp.configファイルから取得
      Dim settings As ConnectionStringSettings
      settings = ConfigurationManager.ConnectionStrings("販売管理ConString")
      If settings Is Nothing Then
          ' 接続文字列取得エラー
          Throw New Exception("app.configに未登録")
      End If

      '---<< テーブルからレコード取得 >>---
      Using con As New SqlConnection
          Using cmd As New SqlCommand
              ' 接続文字列の設定
              con.ConnectionString = settings.ConnectionString
              ' SqlCommand.Connectionプロパティの設定
              cmd.Connection = con
              ' 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

End Class

次はさらに改良して、コンストラクタに、表名、キー列名、キー値を引数として指定するように修正します。この変更でメソッド呼び出すときに引数が不要になります。


Copyright© やさしいVB2012/2010 ADO.NET. All rights reserved.