すぐ使えるADO.NET

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

本の紹介

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

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




【第58号】

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

すぐ使えるADO.NET --> http://park5.wakwak.com/‾weblab/
======================================================================
                  ■■ 社員テーブルを検索する 3 ■■

検索ボタンをクリックすると、入力した社員コードのエラーチェックをして、
エラーが無ければ、社員テーブルから該当レコードを取得し、社員氏名と社員
カナを表示します。接続文字列は、app.configに登録します(前号参照)。

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

┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ 社員テーブル検索                 _□×┃
┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃  Label1    TxtShainCode   BtnKensaku
┃┌―――――┐ ┌―――――┐  ┌――――┐
┃│社員コード│ │     │  │ 検索 │
┃└―――――┘ └―――――┘  └――――┘
┃  Label2    LblShainShimei
┃┌―――――┐ ┌――――――――┐
┃│社員氏名 │ │        │
┃└―――――┘ └――――――――┘
┃  Label3    LblShainKana
┃┌―――――┐ ┌――――――――┐
┃│社員カナ │ │        │
┃└―――――┘ └――――――――┘
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

前号で、sampleデータベースをアクセスする基本クラスClsSampleDBIOの
GetKeyDataメソッドを作成しました。今号では、派生クラスClsShainTableIOの
GetKeyDataメソッドを作成します。

派生クラスClsShainTableIOのGetKeyDataメソッドでは、主に引数のエラー
チェックをして、基本クラスのGetKeyDataメソッドを呼び出します。エラーが
あれば、独自例外myDBIOExceptionをスローします。


基本クラスClsSampleDBIOにもGetKeyDataメソッドがあるので、派生クラスの
GetKeyDataメソッドでは、Overloadsキーワードを付ける必要があります。

  Public Overloads _
  Function GetKeyData(ByVal KeyCode As String) As DataTable

そして、派生クラスClsShainTableIOのGetKeyDataメソッドの中から、
基本クラスClsSampleDBIOのGetKeyDataメソッドを呼び出します。

    RetDataTable = _
    MyBase.GetKeyData("社員テーブル", "社員コード", KeyCode)

引数のエラーチェックは、派生クラスのGetKeyData()メソッドの中で行い、基
本クラスのGetKeyData()メソッドでは、社員テーブルからレコードを取得する
処理のみコーディングします。

ClsShainTableIOは、ClsShainTableIO.vbファイルを追加して作成します。
--【プログラムソースリスト】------------------------------------------
Imports System.Configuration   '参照の追加でSystem.Configurationを追加
Imports System.Data.SqlClient
Imports System.Text.RegularExpressions

Public Class ClsShainTableIO
  Inherits ClsSampleDBIO

  '--------------------< メンバ:変数 >--------------------
  Private mSyainCode As String

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

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

  End Sub

  '*******************************************************************
  ' 機能:引数にした社員コードのレコードを社員テーブルから取得する
  ' 引数: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 myDBIOException("エラー:社員コードが未設定")
        End If

        '引数の前後の空白は除去する
        KeyCode = KeyCode.Trim()
        'キー値文字チェック(キー値は英数字のみで構成されている)
        If Not Regex.IsMatch(KeyCode, "^[0-9a-zA-Z]+$") Then
            '英数字以外はエラー
            Throw New myDBIOException _
            ("エラー:社員コードに不正な文字あり")
        End If

        'キー値長さチェック(社員コードは5桁)
        If Not KeyCode.Length = 5 Then
            '5桁以外はエラー
            Throw New myDBIOException _
            ("エラー:社員コードの桁数が正しくない")
         End If
        '社員テーブルから引数の社員コードのレコードを取得する
        RetDataTable = _
        MyBase.GetKeyData("社員テーブル", "社員コード", KeyCode)

    Catch ex As myDBIOException
        Throw New myDBIOException(ex.Message)

    Catch ex As Exception
        Throw New Exception _
        ("clsSyainTBLIOのgetSyainTableRecで例外発生:" & ex.ToString)

    End Try

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

  End Function

End Class

----------------------------------------------------------------------

★前号の基本クラスのソースリスト再掲載

ClsSampleDBIOは、ClsSampleDBIO.vbファイルを追加して作成します。
--【プログラムソースリスト】------------------------------------------
Option Strict On               'プロジェクトのプロパティでも設定可能

Imports System.Configuration   '参照の追加でSystem.Configurationを追加
Imports System.Data.SqlClient
Imports System.Text.RegularExpressions

Public Class ClsSampleDBIO

  '-------------------------< メンバ:変数 >--------------------------
  'コネクション
  Private con As SqlConnection

  'コマンド
  Private cmd As SqlCommand

  '*******************************************************************
  ' 機能:コンストラクタ
  ' 引数:なし
  '******1*********2*********3*********4*********5**********6*********
  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()            'リターン値

    Try
      Using con As New SqlConnection
          Dim 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

    Catch ex As Exception
      Throw New Exception _
      ("ClsSampleDBIO.getKeyDataで例外発生:" & ex.ToString)

    End Try

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

  End Function

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

    Try
      '----------< 接続関連プロパティ設定 >----------
      '変数の宣言
      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

    Catch ex As Exception
      Throw New Exception _
      ("clsSampleDBIO.setConnectionで例外発生." & ex.ToString)

    End Try

  End Sub

End Class


独自例外は、clsException.vbファイルを追加して作成します。
'--------------- DBIOクラスの独自例外クラス---------------
Public Class myDBIOException
    Inherits ApplicationException

    Public Sub New(ByVal errorMessage As String)
        MyBase.New(errorMessage)
    End Sub

End Class

----------------------------------------------------------------------

次号からは、1レコードを追加するメソッドを作成していきます。

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

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