すぐ使えるADO.NET

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

本の紹介

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

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




【第27号】

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

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

列挙型Enumを利用して、元号をリストボックスに表示します。表示した元号を
選択すると、Enumで宣言した値を取得できます。明治を1として、以下順に、
大正を2、昭和を3、平成を4とします。

  Enum enumGengo
    明治 = 1
    大正
    昭和
    平成
  End Enum

フォームロード時に、リストボックスに元号を追加します。

  ListBox1.Items.Add(enumGengo.明治)
  ListBox1.Items.Add(enumGengo.大正)
  ListBox1.Items.Add(enumGengo.昭和)
  ListBox1.Items.Add(enumGengo.平成)

リストボックスには、元号がそのまま表示されます。

選択された元号の整数値(1〜4)を取得するためには、SelectedIndexChanged
イベントプロシージャで、ListBox1.SelectedItems(0)を整数に変換します。

  Private Sub ListBox1_SelectedIndexChanged( _
    ByVal sender As System.Object, ByVal e As System.EventArgs) _
    Handles ListBox1.SelectedIndexChanged

        Console.WriteLine(CInt(ListBox1.SelectedItems(0)))

  End Sub

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

DataTableにバインドして、TextBoxに社員テーブルのレコードを表示して、ボ
タンをクリックすると、クリックしたボタンに応じて、表示レコードを前後に
移動するプログラムを作成します。

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

◆DataTableとTextBoxのバインドして、社員テーブルを表示するためのプロ
ジェクトを作成します。フォームに下記のコントロールを貼り付けます。
プロパティを図のように設定します。また、TextBoxは、読取専用で使うため、
入力不可にしてフォーカスがあたらないように、次のプロパティも変更します。
ReadOnly:True、TabStop:False

btnFirstを押すと、先頭レコードに移動、btnBeforeを押すと、一つ前の
レコードに移動、btnNextを押すと、次のレコードに移動、btnLastを押すと、
最終レコードに移動します。各ボタンは、表示レコードの位置に応じて、ボタ
ンを押せないようにします。

StatusBar1には、M/Nの形式で、Mに現レコード位置を、Nには総レコード数を
表示します。
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ DataTableとTextBoxのバインド            _□×┃
┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃  Label1    txtSyainCode
┃┌―――――┐ ┌―――――┐
┃│社員コード│ │     │
┃└―――――┘ └―――――┘
┃  Label2    txtSyainSimei
┃┌―――――┐ ┌―――――――――┐
┃│社員氏名 │ │         │
┃└―――――┘ └―――――――――┘
┃  Label3    txtSyainKana
┃┌―――――┐ ┌―――――――――┐
┃│社員カナ │ │         │
┃└―――――┘ └―――――――――┘
┃ btnFirst  btnBefore  btnNext   btnLast
┃┌―――┐ ┌―――┐ ┌―――┐ ┌―――┐
┃│ << │ │ <  │ │  > │ │ >> │
┃└―――┘ └―――┘ └―――┘ └―――┘
┠──────────────────────────────┨
┃StatusBar1                         ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
----------------------------------------------------------------------
フォームロードでは、clsDBIOクラスのgetAllSyain()メソッドを使って、社員
テーブルの全レコードを取得し、テキストボックスにテーブル列を連結します。

  Me.txtSyainCode.DataBindings.Add("Text", oTable, "社員コード")
  Me.txtSyainSimei.DataBindings.Add("Text", oTable, "社員氏名")
  Me.txtSyainKana.DataBindings.Add("Text", oTable, "社員カナ")

StatusBar1に、M/Nの形式で、Mに現レコード位置を、Nには総レコード数を
表示するために、現在レコード位置と全レコード数を取得します。取得した値
をToString()メソッドで、文字列に変換します。

現在レコード位置は、BindingContext(oTable).Position + 1となります。
Positionプロパティは、0から始まりますので、+1しています。

全レコード数表示は、oTable.Rows.Countで取得できます。

現在のレコード位置に応じて、setBtnEnable()メソッドを呼び出して、カーソ
ル移動ボタンの活性・不活性を設定します。先頭位置ならば、btnFirstと
btnBeforeを押せないようにします。最終位置ならば、btnNextとbtnLastを押
せないようにします。レコードが1件の場合は、すべてのボタンを押せないよ
うしています。

clsDBIOクラスにgetAllSyain()メソッドを実装します。社員コードの昇順に表
示しますので、SQL文には、ORDER BY 社員コード を追加しておきます。

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

Public Class Form1
  Inherits System.Windows.Forms.Form

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

  Private oTable As New DataTable()

  '----------<< フォームロード処理 >>----------
  Private Sub Form1_Load _
  (ByVal sender As System.Object, ByVal e As System.EventArgs) _
  Handles MyBase.Load

    Dim oTblSyain As New clsDBIO()

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

    'カーソル移動ボタン活性不活性設定
    Me.setBtnEnable()

    '現在レコード位置/全レコード数表示
    Me.StatusBar1.Text = _
    (Me.BindingContext(oTable).Position + 1).ToString() + _
    " / " + oTable.Rows.Count.ToString()

  End Sub

  '最終レコード位置に移動
  Private Sub btnLast_Click( _
  ByVal sender As System.Object, ByVal e As System.EventArgs) _
  Handles btnLast.Click

    Me.BindingContext(oTable).Position = oTable.Rows.Count - 1

    'カーソル移動ボタン活性不活性設定
    Me.setBtnEnable()

    '現在レコード位置/全レコード数表示
    Me.StatusBar1.Text = _
    (Me.BindingContext(oTable).Position + 1).ToString() + _
    " / " + oTable.Rows.Count.ToString()

  End Sub

  '先頭レコード位置に移動
  Private Sub btnFirst_Click( _
  ByVal sender As System.Object, ByVal e As System.EventArgs) _
  Handles btnFirst.Click

    Me.BindingContext(oTable).Position = 0

    'カーソル移動ボタン活性不活性設定
    Me.setBtnEnable()

    '現在レコード位置/全レコード数表示
    Me.StatusBar1.Text = _
    (Me.BindingContext(oTable).Position + 1).ToString() + _
    " / " + oTable.Rows.Count.ToString()

  End Sub

  '次のレコード位置に移動
  Private Sub btnNext_Click( _
  ByVal sender As System.Object, ByVal e As System.EventArgs) _
  Handles btnNext.Click

    Me.BindingContext(oTable).Position += 1

    'カーソル移動ボタン活性不活性設定
    Me.setBtnEnable()

    '現在レコード位置/全レコード数表示
    Me.StatusBar1.Text = _
    (Me.BindingContext(oTable).Position + 1).ToString() + _
    " / " + oTable.Rows.Count.ToString()

  End Sub

  '前のレコード位置に移動
  Private Sub btnBefore_Click( _
  ByVal sender As System.Object, ByVal e As System.EventArgs) _
  Handles btnBefore.Click

    Me.BindingContext(oTable).Position -= 1

    'カーソル移動ボタン活性不活性設定
    Me.setBtnEnable()

    '現在レコード位置/全レコード数表示
    Me.StatusBar1.Text = _
    (Me.BindingContext(oTable).Position + 1).ToString() + _
    " / " + oTable.Rows.Count.ToString()

  End Sub

  'レコード位置移動ボタン活性不活性設定
  Private Sub setBtnEnable()

    Select Case Me.BindingContext(oTable).Position + 1  'レコード位置
      Case 1  '先頭レコード位置の場合
        Select Case oTable.Rows.Count
          Case 1      '1件の場合
            Me.btnFirst.Enabled = False
            Me.btnBefore.Enabled = False
            Me.btnNext.Enabled = False
            Me.btnLast.Enabled = False
          Case Else   '2件以上の場合
            Me.btnFirst.Enabled = False
            Me.btnBefore.Enabled = False
            Me.btnNext.Enabled = True
            Me.btnLast.Enabled = True
        End Select
      Case oTable.Rows.Count  '最終レコード位置の場合
        Me.btnFirst.Enabled = True
        Me.btnBefore.Enabled = True
        Me.btnNext.Enabled = False
        Me.btnLast.Enabled = False
      Case Else       '中間レコード位置の場合
        Me.btnFirst.Enabled = True
        Me.btnBefore.Enabled = True
        Me.btnNext.Enabled = True
        Me.btnLast.Enabled = True
    End Select

  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

  '*******************************************************************
  ' 機能:社員テーブル全レコード取得メソッド
  ' 引数:なし
  ' 戻値:DataTable型 取得したテーブルレコード行コレクション
  '*******************************************************************
  Public Function getAllSyain() As DataTable

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

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

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

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

    End Try

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

  End Function

  '------ 以下省略 -----

End Class

----------------------------------------------------------------------
            ■■ 次号予告 第28号(7月5日発行予定) ■■
1. VB.NETワンポイント
2. DataTableとLabel等のコントロールをバインドする
======================================================================
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.