すぐ使えるADO.NET

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

本の紹介

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

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




【第6号】

 第6号(2004.5.21発行)
======================================================================
         ★★ VB.NETデータベースプログラミング奮闘記 ★★

----------------------------------------------------------------------
ADO.NETの基本的なプログラミングを中心に掲載します。
末永くご購読の程よろしくお願い申し上げます。

すぐ使えるADO.NETの研究 --> サンプルプログラム満載
                            http://park5.wakwak.com/‾weblab/
======================================================================
                        -----【目次】-----

1. VB.NETワンポイント:Constステートメント
2. VB.NETワンポイントオブジェクト指向:定数クラス
3. 社員テーブルから全レコードを取得する
       ◆ データテーブルオブジェクトDataTableを活用 ◆
4. 次号予告

----------------------------------------------------------------------
          ■■ VB.NETワンポイント:Constステートメント ■■

Constステートメントを使って、リテラル値に代わって、定数を宣言すること
ができます。たとえば、

  Public Const PAGE_MAX As Integer = 10

C言語では、定数に大文字を使う習慣があります。この例でも、大文字を使っ
てみました。通常、次の例のように、識別子の最初の文字と、後に続く各単語
の最初の文字を大文字にする表記が、多く使われているようです。

  Public Const PageMax As Integer = 10

Option Strictが Onの場合、データ型(As 〜)を省略するとコンパイルエラー
になります。Offの場合も、データ型は省略しないほうが良いでしょう。アク
セスレベルも、省略しないほうが良いでしょう。省略すると、Privateになり
ます。

定数宣言は、次のような場合でも、自動的に正しく評価します。

  Public Const I As Integer = J * 2    'この時点で定数Jは未宣言
  Public Const J As Integer = 3

Private Sub form1_Loadプロシジャ内で、Trace.WriteLine(CStr(Me.I)) と
すれば、"6"と出力画面に表示されます。

----------------------------------------------------------------------
      ■■ VB.NETワンポイントオブジェクト指向:定数クラス ■■

Constステートメントをクラス内部で宣言して、定数のクラスを作成すると、
オブジェクトを生成しなくても、使用することができます。

  Public Class SyainIdx
    Public Const SyainCode As Integer = 0
    Public Const SyainSimei As Integer = 1
    Public Const SyainKana As Integer = 2
    Public Const BumonCode As Integer = 3
    Public Const NyusyaNengappi As Integer = 4
    Public Const KosinNitizi As Integer = 5
  End Class

Trace.WriteLine(CStr(SyainIdx.SyainCode))のように、クラス名.メンバ名で
使うことができます。 Newでオブジェクトを生成する必要はありません。

後に出てくる【プログラムソースリスト】の中では、
syainList.Rows(i).Item(0)の代わりに、
syainList.Rows(i).Item(SyainIdx.SyainCode)を使っています。

他のフィールドも同様に、SyainIdxクラスで定義した定数を使っています。

----------------------------------------------------------------------
         ■■ 社員テーブルから全レコードを取得する(2) ■■

創刊号と第2号で、構造体を引数に指定して、社員テーブルから全レコードを
取得するメソッドを作りましたが、今回は、DataTableオブジェクトのインス
タンスを引数に指定して、社員テーブルから全レコードを取得するメソッドを
作ってみます。

sample.mdbの社員テーブルは次のように作成してあります。

key フィールド名   データ型   サイズ  値要求  空文字列の許可
------------------------------------------------------------
● 社員コード  テキスト型   5 はい  いいえ
− 社員氏名   テキスト型  20 はい  いいえ
− 社員カナ   テキスト型  40 いいえ はい
− 部門コード  テキスト型   3 はい  いいえ
− 入社年月日  日付/時刻型  − はい  −
− 更新日時   日付/時刻型  − はい  −

最初に、新規プロジェクトをひとつ作成してください。コントロ−ルは必要と
しません。まず、Sub form1_Load内で、DataTableのインスタンスを生成し、
このインスタンスを引数に指定して、全レコードを取得するメソッドを呼び出
します。戻り値msgが、長さ0の文字列ならば、全レコードの取得成功で、そう
でなければ、レコードの取得は失敗しています。

  Dim syainList As DataTable = New DataTable()
  msg = Me.getSyainAll(syainList)

レコードが取得されると、i件目のレコードの各フィールド値は、

  社員コード ---> syainList.Rows(i).Item(0)
		   氏名    ---> syainList.Rows(i).Item(1)

で参照できます。Item(0),Item(1)では、フィールド名が分かりにくいので、
クラスSyainIdxを宣言して、

  社員コード ---> syainList.Rows(i).Item(SyainIdx.syainCode)
  氏名    ---> syainList.Rows(i).Item(SyainIdx.syainSimei)

のように記述します。このほうが、分かりやすくて良いですね。

Option Strict On の場合は、明示的に型変換が必要ですから、
  strOut += CStr(syainList.Rows(i).Item(SyainIdx.SyainCode))
と、CStr関数で文字列に変換して、代入しています。

社員カナ名は、Null値を許していますので、Null値チェックをしています。

社員テーブルから全レコードを取得するには、DataTableオブジェクト
syainListを引数に指定して、データアダプタのFillメソッドを呼び出します。
  oDataAdapter.Fill(syainList)

レコードが取得できたかどうかは、syainList.Rows.Countで、取得できたレ
コード数を調べます。 取得レコードが0件の時は、Return値に、
"社員テーブルにレコードがありません"を、セットします。

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

Public Class SyainIdx
    Public Const SyainCode As Integer = 0
    Public Const SyainSimei As Integer = 1
    Public Const SyainKana As Integer = 2
    Public Const BumonCode As Integer = 3
    Public Const NyusyaNengappi As Integer = 4
    Public Const KosinNitizi As Integer = 5
End Class

Public Class form1
    Inherits System.Windows.Forms.Form

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

  Private Sub form1_Load(ByVal sender As System.Object, _
                         ByVal e As System.EventArgs) _
                                             Handles MyBase.Load

    '全レコードを取得してコンソールに出力
    Dim syainInfo() As structSyain
    Dim msg As String
    Dim strOut As String
    Dim i As Integer

    '全レコード取得
    Dim syainList As DataTable = New DataTable()
    msg = Me.getSyainAll(syainList)
    If msg = "" Then
      '取得レコードの確認
      For i = 0 To syainList.Rows.Count - 1
        strOut = (i + 1).ToString + "件目==>"
        strOut += "社員コード:"
        strOut += CStr(syainList.Rows(i).Item(SyainIdx.SyainCode))
        strOut += ", 氏名:"
        strOut += CStr(syainList.Rows(i).Item(SyainIdx.SyainSimei))
        '社員カナ名Null値チェック
        If IsDBNull(syainList.Rows(i).Item(SyainIdx.SyainKana)) Then
          strOut += ", カナ:Null"
        Else
          strOut += ", カナ:"
          strOut += CStr(syainList.Rows(i).Item(SyainIdx.SyainKana))
        End If
        strOut += ", 部門コード:"
        strOut += CStr(syainList.Rows(i).Item(SyainIdx.BumonCode))
        strOut += vbCrLf + Space(9)
        strOut += " 入社年月日:"
        strOut += _
               CStr(syainList.Rows(i).Item(SyainIdx.NyusyaNengappi))
        strOut += ", 更新日時:"
        strOut += CStr(syainList.Rows(i).Item(SyainIdx.KosinNitizi))
        Trace.WriteLine(strOut)
      Next
    Else
      'レコードが取得できなかった時の処理
      MessageBox.Show(msg, "エラー")
    End If

  End Sub

  '-----------------------------------------------------------------
  ' 機能:社員テーブルから全レコードを取得する
  ' 引数:ByRef DataTableオブジェクト
  ' 戻値:長さ0の文字列ならば、全レコードの取得成功、
  '       そうでなければ、レコードの取得失敗
  '-----------------------------------------------------------------
  Private Function getSyainAll(ByRef syainList As DataTable) As String

    Const strSelectSyain As String = _
                  "SELECT * FROM 社員テーブル ORDER BY 社員コード"
    Dim oConn As New OleDbConnection()
    Dim oCommand As New OleDbCommand()
    Dim oDataAdapter As New OleDbDataAdapter()
    Dim oDataSet As DataSet = New DataSet()

    Try
      'DB接続文字列の設定
      '注:プロジェクトファイルホルダの下にあるbinホルダにMDBを置く
      oConn.ConnectionString = _
      "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + _
      Application.StartupPath + "¥sample.mdb"

      'コネクションの設定
      oCommand.Connection = oConn

      'SQL文の設定
      oCommand.CommandText = strSelectSyain

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

      oDataAdapter.SelectCommand = oCommand

      'レコードを取得する
      oDataAdapter.Fill(syainList)

      '取得レコード数のチェック
      If syainList.Rows.Count = 0 Then
        'レコードが取得できなかった時の処理
         Return "社員テーブルにレコードがありません"
      Else
         Return ""
      End If

    Catch oExcept As Exception
      '例外が発生した時の処理
      Return oExcept.ToString

    Finally
      'DB接続を閉じる
      If Not oConn Is Nothing Then
        oConn.Close()
      End If
    End Try

  End Function

End Class

----------------------------------------------------------------------
                      ■■ 次号予告 ■■

第7号(6号発行日から10日以内を予定)  月3回位発行予定

1. VB.NETワンポイント
2. ListBoxに表示した部門名称から選択した項目の部門コードを取得する
3. VB.NETワンポイントオブジェクト指向

----------------------------------------------------------------------
5月12日、久々に東京ビジネスショーに行ってきました。
携帯電話関連で大きなブースがありましたが、全体的に地味でした。
======================================================================
VB.NET データベースプログラミング奮闘記    第6号(2004.5.21)
          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.