すぐ使えるADO.NET

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

本の紹介

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

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


Granite countertops granite countertops.



【第21号】

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

----------------------------------------------------------------------
いつもご購読ありがとうございます。ADO.NETの基本的なプログラミングを中
心に掲載しますので、今後ともよろしくお願い申し上げます。

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

1. VB.NETワンポイント:1次元配列の初期化
2. ADO.NET:DataViewの使い方2

----------------------------------------------------------------------
           ■■ VB.NETワンポイント:1次元配列の初期化 ■■

配列変数を宣言と同時に、配列変数を初期化できます。今回は、さまざまな1
次元配列の初期化方法を紹介します。

  '配列の要素がない場合
  'このままでは、値を代入することはできません。
  'たとえば、ary1(0) = "aaa" とすると、実行時エラーになります。
  Dim ary1() As String = New String() {}

  '要素の長さのみ初期値に指定
  'ary2(0) = "", ary2(1) = "", ary2(2) = "" となります。
  Dim ary2() As String = New String(2) {}

  '要素の値のみ初期値に指定(要素の長さも決まる)
  'ary3(0) = "aaa", ary3(1) = "bbbb", ary3(2) = "cc" となります。
  Dim ary3() As String = New String() {"aaa", "bbbb", "cc"}

  'オブジェクト型の配列に、初期値として文字列を指定
  'obj(0) = "アイウエオ", obj(1) = "123" となります。
  Dim obj() As Object = New Object() {"アイウエオ", "123"}

  '要素の長さと値を初期値に指定
  Dim ary4() As String = New String(2) {"aaa", "bbbb", "cc"}

  '配列の長さを指定して変数のみ宣言し、後から値を代入する
  'ary5(0) = "", ary5(1) = "", ary5(2) = "" となります。
  Dim ary5(2) As String

配列の境界外の代入、たとえば、ary5(3) = "dd" は実行時エラーになります。

----------------------------------------------------------------------
                 ■■ ADO.NET:DataViewの使い方2 ■■

今回は、DataViewクラスのFindメソッドと、 FindRowsメソッドの使い方を紹
介します。これら2つのメソッドは、ソートキーの値に基づいて、行を検索す
ることができます。

今回使用するsample.mdbの社員テーブルは、前号と同じです。

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

◆Findメソッドを使って検索すると、検索条件に一致する最初の行
(DataRowViewオブジェクト)のインデックス値(0以上の整数)を返します。
一致する行がない場合には、-1を返します。

  Dim dtvSyain As New DataView(oDataSet.Tables("社員テーブル"), _
                               Nothing, _
                               "社員氏名", _
                               DataViewRowState.CurrentRows)

  Dim idx As Integer = dtvSyain.Find("田中一郎")

Findメソッドまたは、FindRowsメソッドを使用するには、並べ替え順序を指定
します。上のFindメソッド例では、並べ替え順序に"社員氏名"を指定していま
す。並べ替え順序を指定しないと、例外がスローされます。たとえば、上記の
例で、DataViewオブジェクト生成時の引数"社員氏名"を、Nothingに変更する
と、Findメソッド実行時に例外がスローされます。

◆FindRowsメソッドを使って検索すると、DataViewの検索条件に一致するすべ
ての行を参照するDataRowView配列を返します。一致する行がない場合には、
空のDataRowView配列を返します。

  Dim dtvSyain As New DataView(oDataSet.Tables("社員テーブル"), _
                               Nothing, _
                               "部門コード", _
                               DataViewRowState.CurrentRows)

  Dim obj() As Object = New Object() {"102"}

  Dim drvRows() As DataRowView = dtvSyain.FindRows(obj)

drvRows()の項目"社員氏名"を1行ごとに、参照するには、次のようになります。

  Dim idx As Integer
  For idx = 0 To drvRows.Length - 1
    Console.WriteLine(drvRows(idx)("社員氏名"))
  Next

drvRowsのインデックスは、0から始まり、drvRows.Lengthで、drvRowsの行数
がわかります。
各行のフィールド(項目)は、drvRows(idx)("社員氏名")で社員氏名フィールド
を、drvRows(idx)("社員カナ")で社員カナフィールドを参照できます。

なお、Findメソッドと、FindRowsメソッドは、複数列の並べ替えの場合には、
オブジェクトの配列を渡しますが、この値の順序は、DataViewのSortプロパ
ティと一致していなければなりません。

  Dim dtvSyain As New DataView(oDataSet.Tables("社員テーブル"), _
                               Nothing, _
                               "社員カナ, 部門コード", _
                               DataViewRowState.CurrentRows)

  Dim obj() As Object = New Object() {"ナカニシ ツヨシ", "102"}

  Dim drvRows() As DataRowView = dtvSyain.FindRows(obj)

◆FindメソッドとFindRowsメソッドをテストするために、プロジェクトを作成
します。フォームに下記のコントロールを貼り付けます。Textプロパティを図
のように設定します。
Button1を押すと、txtSimeiに入力した社員氏名から、lblSyainCodeに社員
コードを、lblSyainKanaにカナ名を表示します。Button2を押すと、
txtBumonCodeに入力した部門コードから、その部門の社員氏名をすべて
ListBox1に表示します。
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃  Label1      txtSimei     Button1
┃┌――――――┐ ┌――――――┐  ┌――――┐
┃│検索する社員│ │      │  │テスト1│
┃└――――――┘ └――――――┘  └――――┘
┃  Label2     lblSyainCode
┃┌―――――┐  ┌――――――┐
┃│社員コード│  │      │
┃└―――――┘  └――――――┘
┃  Label3     lblSyainKana
┃┌―――――┐  ┌――――――┐
┃│社員カナ │  │      │
┃└―――――┘  └――――――┘
┃
┃  Label4     txtBumonCode    Button2
┃┌――――――┐ ┌――――――┐  ┌――――┐
┃│検索する部門│ │      │  │テスト2│
┃└――――――┘ └――――――┘  └――――┘
┃           ListBox1
┃          ┌――――┐
┃          │    │
┃          │    │
┃          │    │
┃          │    │
┃          └――――┘
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

プログラムソースリストは次のようになります。

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

Imports System.Data.OleDb

Public Class Form1
  Inherits System.Windows.Forms.Form

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

  Private oDataSet As DataSet = New DataSet()

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

    Dim oConn As New OleDbConnection()
    Dim oCommand As New OleDbCommand()
    Dim oDataAdapter As New OleDbDataAdapter()

    Try

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

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

      'SQL文の設定
      Const strSelect As String = _
      "SELECT 社員コード, 社員氏名, 社員カナ, 部門コード " + _
      "FROM 社員テーブル"
      oCommand.CommandText = strSelect

      '社員テーブルから全レコードデータを取得する
      oDataAdapter.SelectCommand = oCommand
      oDataSet.Clear()
      oDataAdapter.Fill(oDataSet, "社員テーブル")

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

    End Try

  End Sub

  '-----<< Findメソッドのテスト >>-----
  Private Sub Button1_Click( _
  ByVal sender As System.Object, ByVal e As System.EventArgs) _
  Handles Button1.Click

    Try
      Dim dtvSyain As New DataView(oDataSet.Tables("社員テーブル"), _
                                   Nothing, _
                                   "社員氏名", _
                                   DataViewRowState.CurrentRows)

      Dim idx As Integer = dtvSyain.Find(Me.txtSimei.Text)

      If idx = -1 Then
        MessageBox.Show("入力した社員は、社員テーブルにありません")
      Else
        Me.lblSyainCode.Text = CStr(dtvSyain(idx)("社員コード"))
        Me.lblSyainKana.Text = CStr(dtvSyain(idx)("社員カナ"))
      End If

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

    End Try

  End Sub

  '-----<< FindRowsメソッドのテスト >>-----
  Private Sub Button2_Click( _
  ByVal sender As System.Object, ByVal e As System.EventArgs) _
  Handles Button2.Click

    Try
      Dim dtvSyain As New DataView(oDataSet.Tables("社員テーブル"), _
                                   Nothing, _
                                   "部門コード", _
                                   DataViewRowState.CurrentRows)

      Dim obj() As Object = New Object() {Me.txtBumonCode.Text}
      Dim drvRows() As DataRowView = dtvSyain.FindRows(obj)

      Me.ListBox1.Items.Clear()
      If drvRows.Length = 0 Then
        MessageBox.Show("該当レコードは、社員テーブルにありません")
      Else
        'リストボックスに社員氏名を表示
        Dim idx As Integer
        For idx = 0 To drvRows.Length - 1
          Me.ListBox1.Items.Add(drvRows(idx)("社員氏名"))
          Next
      End If

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

    End Try

  End Sub

End Class

----------------------------------------------------------------------
            ■■ 次号予告 第22号(2月22日発行予定) ■■

1. VB.NETワンポイント
2. ADO.NETのトランザクション制御

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