すぐ使えるADO.NET

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

本の紹介

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

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




【第56号】

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

すぐ使えるADO.NET --> http://park5.wakwak.com/‾weblab/
======================================================================
              ■■ Usingステートメント使ってDBを開く ■■

VB.NETでは、コネクションのOpenメソッドを呼出したら、Try-Finallyステー
トメントを使って、FinallyブロックでCloseメソッドを呼出すようにコーディ
ングしていました。

しかし、VB 2005から新たに使えるようになった Usingステートメントを使うと、
Closeメソッドを呼出さなくても、End Usingを抜ける時に自動的に接続を閉じ
ることができます。したがって、Finallyブロックで、closeメソッドを明示的
に呼出す必要はありません。

Usingステートメントを使うと、プログラムが短くなるばかりか、確実にオブ
ジェクトを廃棄でき、バグの出にくいプログラムを作成できます。

Usingステートメントを使って、前号のサンプルプログラムを修正しました。

  Try
      Using con As New SqlConnection

          Dim settings As ConnectionStringSettings

          '接続文字列をapp.configファイルから取得
          settings = _
          ConfigurationManager.ConnectionStrings _
          ("AdoNet.My.MySettings.sampleDBConStr")

          If settings Is Nothing Then

            '接続文字列取得エラー
            MessageBox.Show("app.configに未登録", "接続文字列エラー")

          Else

            '接続文字列の設定
            con.ConnectionString = settings.ConnectionString

            'DBを開く
            con.Open()

          End If

      End Using

  Catch ex As Exception

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

  '***** Closeメソッドの呼び出しは不要 *****
  'Finally

  '    'DBを閉じる
  '    If Not con.State = ConnectionState.Closed Then
  '        con.Close()
  '    End If

  End Try

以降この方式で、コーディングしていくことにします。

----------------------------------------------------------------------
              ■■ 社員テーブルを検索する ■■

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

【社員テーブル】
---------------------------------------------
key  列 名   データ型    nullを許容
---------------------------------------------
○ 社員コード  nchar(5)    許容しない
− 社員氏名   nvarchar(20)  許容しない
− 社員カナ   nvarchar(40)  許容しない
− 部署コード  nchar(4)    許容しない
− 更新日時   datetime    許容しない
---------------------------------------------

◆プロジェクトをひとつ作成して、フォームに下記のコントロールを貼り付
けて、プロパティを図のように設定します。

┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ 社員テーブル検索                 _□×┃
┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃  Label1    TxtShainCode   BtnKensaku
┃┌―――――┐ ┌―――――┐  ┌――――┐
┃│社員コード│ │     │  │ 検索 │
┃└―――――┘ └―――――┘  └――――┘
┃  Label2    LblShainShimei
┃┌―――――┐ ┌――――――――┐
┃│社員氏名 │ │        │
┃└―――――┘ └――――――――┘
┃  Label3    LblShainKana
┃┌―――――┐ ┌――――――――┐
┃│社員カナ │ │        │
┃└―――――┘ └――――――――┘
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

社員コードは、英数字と_と-で構成されている前提で、エラーチェックしてい
ます。

接続文字列は、app.configに、次のようにあらかじめ登録しておきます。見や
すいように適時折り返しています。

    <connectionStrings>
        <add name="AdoNet.My.MySettings.sampleDBConStr"
        connectionString="Data Source=.¥SQLEXPRESS;
                          AttachDbFilename=|DataDirectory|¥sample.mdf;
                          Integrated Security=True;
                          Connect Timeout=30;
                          User Instance=True"
        providerName="System.Data.SqlClient" />
    </connectionStrings>

SQL Serverの場合は、Imports System.Data.SqlClient をImportsします。

SqlParameter で使用するデータ型は、SqlDbType 列挙体として定義されてい
ます。cmd.Parameters.Add("@KeyValue", SqlDbType.NChar, 5)のデータ型に
注意すれば、OleDbとまったく同様のコーディングになります。

さっそく、Usingステートメントを使いました。Usingで生成したconは、
End Usingを抜ける時に、自動的に解放されます。

    Using con As New SqlConnection
      ..............
      ..............
    End Using

Fillメソッドを使うと、FillメソッドがOpenメソッドとCloseメソッドを自動
的に呼出します。したがって、明示的に、Openメソッドを呼び出す必要はあり
ませんが、たとえOpenメソッドを呼出したとしても、Usingステートメントを
使っているので、Closeメソッドは呼出しません。


--【プログラムソースリスト】------------------------------------------
Imports System.Data.SqlClient
Imports System.Configuration   '参照の追加でSystem.Configurationを追加
Imports System.Text.RegularExpressions

Public Class Form056

  '====================<< 検索ボタン押下時 >>====================
  Private Sub BtnKensaku_Click _
  (ByVal sender As System.Object, ByVal e As System.EventArgs) _
  Handles BtnKensaku.Click

    Dim dt As New DataTable()            'リターン値

    Try
      Using con As New SqlConnection
        Dim cmd As New SqlCommand

        '----------< 接続関連プロパティ設定 >----------
        '変数の宣言
        Dim settings As ConnectionStringSettings

        '接続文字列をapp.configファイルから取得
        settings = _
        ConfigurationManager.ConnectionStrings _
        ("AdoNet.My.MySettings.sampleDBConStr")

        If settings Is Nothing Then
            '接続文字列取得エラー
            Throw New Exception _
            ("接続文字列がapp.configに未登録.")
        End If

        '接続文字列の設定
        con.ConnectionString = settings.ConnectionString

        'SqlCommand.Connectionプロパティの設定
        cmd.Connection = con

        'SQL文設定
        cmd.CommandText = "SELECT * FROM 社員テーブル" & _
        " WHERE 社員コード = @KeyValue"

        'SQL文の引数設定
        cmd.Parameters.Clear()
        cmd.Parameters.Add("@KeyValue", SqlDbType.NChar, 5)

        '----------< コマンド引数に値を設定 >----------
        '前後の空白は除去する
        Me.TxtShainCode.Text = Me.TxtShainCode.Text.Trim()

        '入力値のチェック(注:キー値は英数字と_と-で構成されている)
        If Not Regex.IsMatch(Me.TxtShainCode.Text, "^[0-9a-zA-Z_¥-]+$") Then
            '英数字_-以外はエラー
            Me.LblShainShimei.Text = Nothing
            Me.LblShainKana.Text = Nothing
            MessageBox.Show _
            ("入力した社員コードに誤りがあります", "入力エラー")

        Else
            '入力値が正常
            cmd.Parameters("@KeyValue").Value = Me.TxtShainCode.Text

            '----------< テーブルからレコード取得 >----------
            Dim da As New SqlDataAdapter
            da.SelectCommand = cmd
            da.Fill(dt)
            If dt.Rows.Count = 1 Then
              'レコードがあった時
              Me.LblShainShimei.Text = CStr(dt.Rows(0)("社員氏名"))
              Me.LblShainKana.Text = CStr(dt.Rows(0)("社員カナ"))
            Else
              'レコードが無い時
              Me.LblShainShimei.Text = Nothing
              Me.LblShainKana.Text = Nothing
              MessageBox.Show _
              ("入力した社員コードのデータがありません", "入力エラー")
            End If

        End If

      End Using

    Catch ex As Exception
      MessageBox.Show(ex.ToString, "例外発生")

    End Try

  End Sub

End Class

----------------------------------------------------------------------

次号では、引数に指定したテーブル名と主キー値からレコードを取得する
GetKeyDataメソッドを、クラスメソッドとして実装します。

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