すぐ使えるADO.NET

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

本の紹介

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

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


Showroom tile display stand marble quartz stone countertop.



【第26号】

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

すぐ使えるADO.NET --> サンプルプログラム満載
                      http://park5.wakwak.com/‾weblab/
======================================================================
               ■■ VB.NETワンポイント:列挙型Enum ■■

列挙型Enumは、ある特定の整数値しか代入できないデータ型で、任意につくる
ことができます。数値にわかりやすい名前をつけておけば、数値が何を意味す
るのかがわかりやすくなります。基本的な定義方法は、次のようになります。

  Enum enumPlanet
    Mercury
    Venus
    Earth
    Mars
  End Enum

As句を省略すると、Integer型になります。Enumの値は整数値に限られますの
で、As句を指定する場合は、Byte, Short, Integer, Longのいずれかの型にな
ります。

値を指定しない場合は、先頭の名前が0となり、以降の名前は、順に+1した値
になります。

  Console.WriteLine(enumPlanet.Mercury)       'enumPlanet.Mercury = 0
  Console.WriteLine(enumPlanet.Venus)         'enumPlanet.Venus = 1
  Console.WriteLine(enumPlanet.Earth)         'enumPlanet.Earth = 2
  Console.WriteLine(enumPlanet.Mars)          'enumPlanet.Mars = 3

  '列挙型enumPlanetの変数定義及び代入
  Dim wakusei As enumPlanet
  wakusei = enumPlanet.Earth
  Console.WriteLine(wakusei)                  'wakusei = 2

名前に値を指定すると、指定した名前がその値となり、以降の名前は、順に+1
した値になります。

  Enum enumPlanet2
    Mercury
    Venus = -5
    Earth
    Mars
  End Enum

  Dim wakusei2 As enumPlanet2
  wakusei2 = enumPlanet2.Earth
  Console.WriteLine(wakusei2)                 'wakusei2 = -4

----------------------------------------------------------------------
              ■■ DataTableとTextBoxをバインドする ■■

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

使用するテーブルは、sample.mdbの社員テーブルです。
------------------------------------------------------------
key フィールド名   データ型   サイズ  値要求  空文字列の許可
------------------------------------------------------------
○ 社員コード  テキスト型   5 はい  いいえ
− 社員氏名   テキスト型  20 はい  いいえ
− 社員カナ   テキスト型  40 いいえ はい
− 部門コード  テキスト型   3 はい  いいえ
− 更新日時   日付/時刻型  − はい  −
------------------------------------------------------------

◆プロジェクトをひとつ作成します。フォームに下記のコントロールを貼り付
けます。プロパティを図のように設定します。
また、txtSyainSimeiとtxtSyainKanaは、読取専用で使うため、入力不可にし
てフォーカスがあたらないように、次のプロパティも変更します。
ReadOnly:True、TabStop:False
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ DataTableとTextBoxのバインド           _□×┃
┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃  Label1    txtSyainCode   BtnKensaku
┃┌―――――┐ ┌―――――┐  ┌――――┐
┃│社員コード│ │     │  │ 検索 │
┃└―――――┘ └―――――┘  └――――┘
┃  Label2    txtSyainSimei
┃┌―――――┐ ┌――――――――┐
┃│社員氏名 │ │        │
┃└―――――┘ └――――――――┘
┃  Label3    txtSyainKana
┃┌―――――┐ ┌――――――――┐
┃│社員カナ │ │        │
┃└―――――┘ └――――――――┘
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

エラーチェックは、社員検索クラスclsSyainKensakuのSetプロパティに実装
します。入力エラーがあれば、clsExceptionクラスの例外をスローします。
clsException例外クラスは、独自のエラーメッセージを表示するためのクラス
として実装します。
DBアクセス処理は、clsDBIOクラスに実装します。

----------------------------------------------------------------------
テキストボックスにテーブル列を連結するためには、DataBindingsコレクショ
ンプロパティのaddメソッドを呼び出します。addメソッドには、3個の引数を
指定します。今回の場合は次のようになります。

  Me.txtSyainSimei.DataBindings.Add("Text", oTable, "社員氏名")

テキストボックスコントロールが、BindingContextオブジェクトをとおして、
データテーブルoTableの社員氏名フィールド(列)に連結されます。同様に社員
カナフィールド(列)に連結するには、

  Me.txtSyainKana.DataBindings.Add("Text", oTable, "社員カナ")

とします。"Text"は、テキストボックスのプロパティ名で、テキストボックス
にフィールド(列)の値が表示されるようになります。DataTable型のoTableに
は、入力した社員コードに一致する社員テーブルレコード(行)が格納されてい
ます。

--【プログラムソースリスト:Form1.vb】--------------------------------
Public Class Form1
  Inherits System.Windows.Forms.Form

#Region " Windows フォーム デザイナで生成されたコード "
  '自動生成部分省略
#End Region

  Private oTable As New DataTable()

  '検索ボタンをクリックしたときの処理
  Private Sub btnKensaku_Click( _
  ByVal sender As System.Object, ByVal e As System.EventArgs) _
  Handles btnKensaku.Click

    Dim oTblSyain As New clsDBIO()
    Dim oSyain As New clsSyainKensaku()

    Try
      '入力項目のエラーチェック
      oSyain.p社員コード = Me.txtSyainCode.Text

      oTable = oTblSyain.getSyainRec(Me.txtSyainCode.Text)

      'テキストボックスにテーブル列を連結
      Me.txtSyainSimei.DataBindings.Add("Text", oTable, "社員氏名")
      Me.txtSyainKana.DataBindings.Add("Text", oTable, "社員カナ")

    Catch oExcept As clsException
      '例外が発生した時の処理
      MessageBox.Show(oExcept.Message, "エラー発生")

    Catch oExcept As Exception
      '例外が発生した時の処理
      MessageBox.Show(oExcept.ToString, "例外発生")

    End Try

  End Sub

End Class

--【プログラムソースリスト:clsSyainKensaku.vb】----------------------
Imports System.Text.RegularExpressions

Public Class clsSyainKensaku

  '---------------<< 変数 >>---------------
  Private m社員コード As String
  Private mDBIO As clsDBIO

  '---------------<< コンストラクタ >>---------------
  Public Sub New()

    '必ず1行目に記述(コンストラクタに引数のない場合は省略可能)
    MyBase.New()

    Try
      'DBアクセスオブジェクト生成
      mDBIO = New clsDBIO()

    Catch oExcept As Exception
      Throw New Exception _
      ("clsDBIOのコンストラクタで例外発生. " + oExcept.ToString)

    End Try

  End Sub

  '---------------<< プロパティ >>---------------
  '◆社員コードプロパティ
  Public Property p社員コード() As String

    '◇Getプロパティ
    Get
      Return m社員コード
    End Get

    '◇Setプロパティ
    Set(ByVal Value As String)
      '********** 入力値エラーチェック **********
      '数字以外はエラー
      If Not Regex.IsMatch(Value, "^[0-9]+$") Then
        Throw New clsException("社員コードは数字で入力してください")
      End If

      '5桁以外はエラー
      If Not Value.Length = 5 Then
        Throw New clsException("社員コードは5桁で入力してください")
      End If

      '社員マスタになければエラー
      If mDBIO.existKeySyain(Value) = False Then
        Throw New clsException("この社員コードは未登録です")
      End If

      m社員コード = Value
    End Set

  End Property

End Class

--【プログラムソースリスト:clsException.vb】-------------------------
Public Class clsException
  Inherits ApplicationException

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

End Class

--【プログラムソースリスト:clsDBIO.vb】------------------------------
Imports System.Data.OleDb

Public Class clsDBIO

  '--------------------< メンバ:変数 >--------------------
  'コネクション
  Private mConn As OleDbConnection
  'コマンド
  Private mCommand As OleDbCommand

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

    Try
      'DB接続文字列の設定
      mConn = New OleDbConnection()
      mConn.ConnectionString = _
      "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" _
      & Application.StartupPath & "¥sample.mdb"

      'コネクションオブジェクトの設定
      mCommand = New OleDbCommand()
      mCommand.Connection = mConn

    Catch oExcept As Exception
      Throw New Exception _
      ("clsDBIOのコンストラクタで例外発生" + oExcept.ToString)

    End Try

  End Sub

  '*******************************************************************
  ' 機能:引数にした社員コードのレコードを社員テーブルから取得する
  ' 引数:String型:取得する社員コード
  ' 戻値:DataTable型
  '*******************************************************************
  Public Function getSyainRec(ByVal parCode As String) As DataTable

    Dim retDataTable As New DataTable()         'リターン値
    Dim dataAdapter As New OleDbDataAdapter()

    Try
      'SQL文設定
      mCommand.CommandText = "SELECT * FROM 社員テーブル " + _
      "WHERE 社員コード = " + "'" + parCode + "'"

      'テーブルからレコード取得
      dataAdapter.SelectCommand = mCommand
      dataAdapter.Fill(retDataTable)

    Catch oExcept As Exception
      Throw New Exception _
      ("clsTableSyainのgetAllRecで例外発生" + oExcept.ToString)

    End Try

    Return retDataTable

  End Function

  '*******************************************************************
  ' 機能:社員テーブルのキー値のレコードの有無を調べる
  ' 引数:キー値
  ' 戻値:ある-->True、ない-->False
  '*******************************************************************
  Public Function existKeySyain(ByVal parKey As String) As Boolean

    Dim retBool As Boolean                      'リターン値

    Try
      'SQL文設定
      mCommand.CommandText = _
      "SELECT COUNT(*) FROM 社員テーブル WHERE 社員コード = @Key"

      '***** SQL文の引数設定 *****
      mCommand.Parameters.Clear()
      mCommand.Parameters.Add( _
      New OleDbParameter("@key", OleDbType.Char, 5))

      '----------< コマンドパラメータに値を設定 >----------
      mCommand.Parameters("@key").Value = parKey       'キー値の設定

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

      'レコード件数取得
      Dim Count As Integer = CInt(mCommand.ExecuteScalar())

      '----------< 戻値を設定 >----------
      If Count = 1 Then
        retBool = True
      Else
        retBool = False
      End If

    Catch oExcept As Exception
      Throw New Exception _
      ("clsTableSyainのexistKeyRecで例外発生" + oExcept.ToString)

    End Try

    Return retBool

  End Function

End Class

----------------------------------------------------------------------
              ■■ 次号予告 第27号(6月9日発行予定) ■■
1. VB.NETワンポイント
2. DataTableとTextBoxをバインドする2
======================================================================
VB.NET データベースプログラミング奮闘記
          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.