すぐ使えるADO.NET

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

本の紹介

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

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




【第57号】

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

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

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

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

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

前号の検索ボタン押下時の処理を、ClsShainTableIOクラスを呼び出すように
修正します。

そのために、sampleデータベースをアクセスする基本クラスClsSampleDBIOと、
社員テーブル用に独自処理をする派生クラスClsShainTableIOを作成します。


【修正後のソースリスト】

Public Class Form056

  '====================<< 検索ボタン押下時 >>====================
  Private Sub BtnKensaku_Click _
  (ByVal sender As System.Object, ByVal e As System.EventArgs) _
  Handles BtnKensaku.Click

    Dim shainTable As New ClsShainTableIO
    Dim dt As New DataTable

    Try
        dt = shainTable.GetKeyData(Me.TxtShainCode.Text)
        If dt.Rows.Count = 1 Then
            'レコードがあった時
            Me.LblShainShimei.Text = CStr(dt.Rows(0)("社員氏名"))
            Me.LblShainKana.Text = CStr(dt.Rows(0)("社員カナ"))
        Else
            'レコードが無い時
            Me.LblShainShimei.Text = Nothing
            Me.LblShainKana.Text = Nothing
            MessageBox.Show _
            ("入力した社員コードのデータがありません", "入力エラー")
        End If

    Catch ex As myDBIOException
        'DBIO独自例外発生時
        Me.LblShainShimei.Text = Nothing
        Me.LblShainKana.Text = Nothing
        MessageBox.Show(ex.Message, "エラー発生")

    Catch ex As Exception
        MessageBox.Show(ex.ToString, "例外発生")

    End Try

  End Sub

End Class

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

まず、基本クラスClsSampleDBIOでは、引数にテーブル名やSQL文の引数を指定
して、各テーブル共通のデータベースアクセス処理を作成します。

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

今回は、引数に指定したテーブルのキー値のレコードを取得するメソッド
GetKeyData()を基本クラスに作成します。

テーブル名の主キーフィールドのデータ型はNChar型として作成します。この
方式では、主キーに他のデータ型がある場合、別途そのデータ型用のメソッド
を作成する必要があります。したがって、sampleデータベースの各テーブルの
主キーのデータ型は、NChar型に統一します。

引数のエラーチェックは、派生クラスのGetKeyData()メソッドでしますので、
基本クラスのGetKeyData()メソッドでは、エラーチェックを省略して、基本ク
ラスの処理をシンプルにします。

接続文字列の取得や接続に関連したプロパティ設定の処理は、共通処理として、
SetConnection()メソッドにまとめます。ただし、外部から呼び出せないよう
に、Privateメソッドにします。

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
----------------------------------------------------------------------

次号では、派生クラスのGetKeyData()メソッドを作成します。

----------------------------------------------------------------------
                       ■■ SqlDbType 列挙体 ■■

  cmd.Parameters.Add("@KeyValue", SqlDbType.NChar)

のSqlDbType.NCharは、SQL Serverのデータ型を指定するために使用する
SqlDbType列挙体です。SqlDbType列挙体のメンバを一覧表にまとめましたので
参考にしてください。
----------------------------------------------------------------------
 SqlDbType列挙体メンバ    VB 2005 での型
----------------------------------------------------------------------
 SqlDbType.BigInt       Int64
 SqlDbType.Binary       Byte型のArray  1〜8,000Byteまでの固定長
 SqlDbType.Bit          Boolean
 SqlDbType.Char         String  Unicode以外の1〜8,000文字の固定長
 SqlDbType.DateTime     DateTime 1753/1/1〜9999/12/31の日付と時刻
 SqlDbType.Decimal      Decimal  -10の38乗-1〜10の38乗-1の固定小数
 SqlDbType.Float        Double
 SqlDbType.Image        Byte型のArray  2,147,483,647Byteまでのバイナリ
 SqlDbType.Int          Int32
 SqlDbType.Money        Decimal -922,337,203,685,477.5808〜
                                +922,337,203,685,477.5807
 SqlDbType.NChar        String  Unicode1〜4,000文字の固定長
 SqlDbType.NText        String  Unicode1,073,741,823文字までの可変長
 SqlDbType.NVarChar     String  Unicode1〜4,000文字の可変長
 SqlDbType.Real         Single
 SqlDbType.SmallDateTime  DateTime  1900/1/1〜2079/6/6の日付と時刻
 SqlDbType.SmallInt     Int16
 SqlDbType.SmallMoney   Decimal  -214,748.3648〜+214,748.3647
 SqlDbType.Text         String  Unicode以外2,147,483,647までの可変長
 SqlDbType.Timestamp    Byte型のArray  8Byte
 SqlDbType.TinyInt      Byte
 SqlDbType.UniqueIdentifier  Guid  128ビットの整数
 SqlDbType.VarBinary    Byte型のArray  1〜8,000Byteまでの可変長
 SqlDbType.VarChar      String  Unicode以外1〜8,000文字の可変長
 SqlDbType.Variant      Object
----------------------------------------------------------------------

======================================================================
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.