すぐ使えるADO.NET

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

本の紹介

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

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




【第15号】

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

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

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

1. VB.NETワンポイント:Collectionオブジェクト
2. EXCELファイルを読み込んで、ラベルコントロールに表示する

----------------------------------------------------------------------
         ■■ VB.NETワンポイント:Collectionオブジェクト ■■

今回は、Collectionオブジェクトを紹介します。Collectionオブジェクトには、
Addメソッドを使って、任意のオブジェクトを追加することができます。メン
バは、インデックス1からCount値までに格納されます。0には格納されません。

たとえば、フォーム上のコントロールをコレクションに格納する場合には、次
のようにします。

まず、Collectionオブジェクトのインスタンスを生成します。

  Dim objCtlColl As New Collection()

メンバの追加は、Addメソッドを使います。引数には、オブジェクトとキー値
(String型で一意にする)を指定します。既にフォームで定義済のテキストボッ
クスコントロ-ル(TextBox1,TextBox2,TextBox3)を追加するには、一意のキー
値と共に、次のようにコーディングします。

  objCtlColl.Add(TextBox1, "txt1")
  objCtlColl.Add(TextBox2, "txt2")
  objCtlColl.Add(TextBox3, "txt3")

コレクションの各メンバを参照するには、前号で紹介したFor Each … Next
ステートメントを使用します。

  Dim objCtl As Control
  For Each objCtl in objCtlColl
    'バックカラープロパティにAquamarine色を設定
    objCtl.BackColor = Color.Aquamarine
  Next

キー値を使っても、個々に同様な設定することができます。プロパティの設定
をしますので、objCtlCollは、Ctype関数でControl型に変換します。

  Dim objCtl2 As Control

  objCtl2 = CType(objCtlColl.Item("txt1"), Control)
  objCtl2.BackColor = Color.Red

  objCtl2 = CType(objCtlColl.Item("txt3"), Control)
  objCtl2.BackColor = Color.Aquamarine

メンバを削除する場合は、Removeメソッドを使います。
先頭のメンバを削除する場合は次のようになります。

  objCtlColl.Remove(1)    '注:Remove(0)ではない

また、キー値を使っても削除できます。

  objCtlColl.Remove("txt2")

----------------------------------------------------------------------
  ■■ EXCELファイルを読み込んで、ラベルコントロールに表示する ■■

下記のExcelシート(シート名は、デフォルトの"Sheet1")のデータを読み込み、
ラベルコントロールに表示する方法を紹介します。

       A          B           C         D
----------------------------------------------------------------
 1  郵便番号  都道府県名  市区町村名  町域名
 2  100-0102  東京都      大島大島町  岡田
 3  100-0211  東京都      大島大島町  差木地
 4  100-0103  東京都      大島大島町  泉津
 :
 n  104-0061  東京都      中央区      銀座
 :

最初に、新規プロジェクトをひとつ作成します。ツールボックスから、コント
ロールを貼り付け、プロパティを設定します。txtYubinBangoがテキストボッ
クス、btnKensakuがボタンで、他はラベルです。

┏━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃   Label1     txtYubinBango  btnKensaku
┃┌―――――┐┌――――┐  ┌――――┐
┃│郵便番号 ││    │  │ 検索 │
┃└―――――┘└――――┘  └――――┘
┃    Label2      lblKenmei
┃┌―――――┐┌――――――――┐
┃│都道府県名││        │
┃└―――――┘└――――――――┘
┃    Label3      lblShicyosonMei
┃┌―――――┐┌――――――――┐
┃│市区町村名││        │
┃└―――――┘└――――――――┘
┃    Label4      lblChoMei
┃┌―――――┐┌――――――――┐
┃│ 町域名 ││        │
┃└―――――┘└――――――――┘
┗━━━━━━━━━━━━━━━━━━━━━━━━━┛

郵便番号のtxtYubinBangoには、"123-4567"のように入力します。今回は、
入力エラーチェックは省略します。

JetOLEDBプロバイダを使用して、Excelブックにアクセスします。この場合の
接続文字列について説明します。

JetOLEDBプロバイダを使用しますので、今までと同様に、
Providerパラメータには、Microsoft.Jet.OLEDB.4.0を指定します。

  Provider=Microsoft.Jet.OLEDB.4.0;

Data Source パラメータには、Excelブックのフルパスを指定します。
プロジェクトファイルホルダの下のbinホルダに郵便番号簿.xlsを置けば、

  Data Source= d:¥…¥...¥bin¥郵便番号簿.xls;

d:¥…¥...¥binは、開発環境により異なりますので、実際には、
Application.StartupPath で取得します。

Extended Properties パラメータには、プロパティが2つあり、";"で区切って
指定します。

1番目は、データベースの種類で、Excel97、2000、2002のExcelブックには、
Excel 8.0を指定します。

2番目は、最初の行がヘッダー(フィールド名)か否かの指定で、最初の行が
ヘッダーの場合には、HDR=YESを指定します。HDR=NOの場合は、自動的に
フィールド名前が付けられます。

  Extended Properties="Excel 8.0;HDR=YES;"

入力した郵便番号の1行を取得するSQL文は、

  "Select * from [Sheet1$] WHERE 郵便番号 = @yubinBango"

です。テーブル名には、[Sheet1$]のように、シート名の後にドル記号を付加
して指定します。@yubinBangoは、画面から入力した郵便番号をセットします。

Excelブックのデータを取得するには、ataAdapterオブジェクトのFillメソッ
ドを使いますが、データベースの接続は自動的に行われますので、Openメソッ
ドとCloseメソッドを呼び出す必要はありません。

クラスの先頭で、定数クラス(YBIdx)でフィールド名のインデックス値を定義
していますが、こうしておけば、1行目の都道府県名は、

  Dim yubinBangoList As New DataTable() として、

  yubinBangoList.Rows(0).Item(1)は、
  yubinBangoList.Rows(0).Item(YBIdx.todofukenMei) となります。

では、ソースリストを掲載します。

--【プログラムソースリスト】------------------------------------------

Imports System.Data.OleDb

Public Class YBIdx
  Public Const yubinBango As Integer = 0
  Public Const todofukenMei As Integer = 1
  Public Const shichosonMei As Integer = 2
  Public Const choikiMei As Integer = 3
End Class

Public Class frmExcelIN
  Inherits System.Windows.Forms.Form

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

  '---------- 検索ボタン押下時の処理 ----------
  Private Sub btnKensaku_Click(ByVal sender As System.Object, _
      ByVal e As System.EventArgs) Handles btnKensaku.Click

    Dim oConn As New OleDbConnection()
    Dim oCommand As New OleDbCommand()
    Dim oDataAdapter As New OleDbDataAdapter()
    Dim oDataSet As DataSet = New DataSet()
    Dim yubinBangoList As New DataTable()

    Try

      'DB接続文字列の設定
      'プロジェクトファイルホルダの下のbinホルダにExcelファイルを置く
      oConn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0; " + _
      "Data Source=" + Application.StartupPath + "¥郵便番号簿.xls;" + _
      "Extended Properties=""Excel 8.0;HDR=YES;"""

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

      'SQL文の設定
      '注:シート名は、デフォルトの"Sheet1"のまま使っています
      oCommand.CommandText = "Select * from [Sheet1$] " + _
      "WHERE 郵便番号 = @yubinBango"

      'SELECTコマンドの設定
      oDataAdapter.SelectCommand = oCommand

      'SQL文パラメータの設定
      oCommand.Parameters.Add( _
        New OleDbParameter("@yubinBango", OleDbType.Char, 8))
      oCommand.Parameters("@yubinBango").Value = Me.txtYubinBango.Text

      'データを取得する
      oDataAdapter.Fill(yubinBangoList)
      '取得レコード数のチェック
      If yubinBangoList.Rows.Count = 1 Then
        Me.lblKenmei.Text = _
          CStr(yubinBangoList.Rows(0).Item(YBIdx.todofukenMei))
        Me.lblShicyosonMei.Text = _
          CStr(yubinBangoList.Rows(0).Item(YBIdx.shichosonMei))
        Me.lblChoMei.Text = _
          CStr(yubinBangoList.Rows(0).Item(YBIdx.choikiMei))
      ElseIf yubinBangoList.Rows.Count = 0 Then
        '行データがなかった時の処理
        MessageBox.Show("郵便番号簿にデータがありません", "エラー")
        Me.lblKenmei.Text = ""
        Me.lblShicyosonMei.Text = ""
        Me.lblChoMei.Text = ""
        Me.txtYubinBango.Focus()
      Else
        '行データが重複していた時の処理
        MessageBox.Show("郵便番号簿に同一郵便番号が2行以上あります", "エラー")
      End If

    Catch oExcept As Exception
      '例外が発生した時の処理
      MsgBox(oExcept.ToString, MsgBoxStyle.OKOnly)
    End Try

  End Sub

End Class
----------------------------------------------------------------------
            ■■ 次号予告 第16号(10月18日頃発行予定) ■■

1. VB.NETワンポイント
2. ADO.NET:Excelファイルの追加処理と更新処理

======================================================================
VB.NET データベースプログラミング奮闘記    第15号(2004.9.30)
          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.