すぐ使えるADO.NET

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

本の紹介

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

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




【第18号】

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

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

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

1. VB.NETワンポイント:IsDate関数とIsLeapYearメソッド
2. ADO.NET:Excelファイルの論理的削除処理 2

----------------------------------------------------------------------
     ■■ VB.NETワンポイント:IsDate関数とIsLeapYearメソッド ■■

◆IsDate関数
前号で、文字列をDate型に変換する関数DateValueを紹介しましたが、引数の
文字列が正しい日付を表現していない場合、例外を発生します。CDate関数も
同様です。

  Dim dateTemp As Date = DateValue("2004/15/1 14:00:00")

とすると、月が存在しないため、例外が発生します。

今回は変換前に、文字列が正しく日付を表現しているか検査するIsDate関数を
紹介します。
IsDate関数は、引数がDate型の場合、またはDate型に変換できる文字列の場合、
Trueを返し、それ以外は、Falseを返します。

次の例では、エラーメッセージ「日付ではありません」が表示さます。

    strDate = "2004/15/1 14:00:00"
    If IsDate(strDate) Then
        dateTmp = DateValue(strDate)
        Trace.WriteLine(CStr(dateTmp))
    Else
        MessageBox.Show("日付ではありません")
    End If

"2004/12/1 140000" の場合は、時刻の書式が正しくありませんから、
IsDate("2004/12/1 140000")は、Falseを返します。

◆DateTime.IsLeapYearメソッド
うるう年をチェックするDateTime.IsLeapYearメソッドも紹介します。
DateTime.IsLeapYearメソッドを使えば、うるう年のチェックが簡単にできま
す。引数には、西暦年を指定します。うるう年の場合、Trueを返し、それ以外
は、Falseを返します。

    If DateTime.IsLeapYear(2004) Then
        MessageBox.Show("うるう年です")
    Else
        MessageBox.Show("うるう年ではありません")
    End If

----------------------------------------------------------------------
         ■■ ADO.NET:Excelファイルの論理的な削除処理 2 ■■

前号のつづきです。論理的な削除処理の削除ボタン押下処理を掲載します。

Excelシート(シート名は、デフォルトの"Sheet1")と画面は、次のとおりです。

       A          B         C           D         E
----------------------------------------------------------------
 1  削除区分  郵便番号  都道府県名  市区町村名  町域名
 2            100-0102  東京都      大島大島町  岡田
 3            100-0211  東京都      大島大島町  差木地
 :

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

削除する場合には、削除区分フィールドに'd'の文字をセットして、更新処理
します。参照する時は、削除区分が'd'の行をWHERE句で除外して、削除行を
選択できないようにします。

削除処理で使用する更新処理のSQL文は、次のようになります。
  "UPDATE [Sheet1$] SET 削除区分='d' WHERE 郵便番号=@yubinBango"

テーブル名は、'['と']'で囲って、[Sheet1$]とします。

削除区分に文字'd'をセットして、パラメータの@yubinBangoには、画面から入
力した削除する行の郵便番号をセットします。そして、ExecuteNonQuery
メソッドを呼び出して、更新処理を実行します。

メソッドの戻り値は、更新処理したレコード数になります。正常に更新処理さ
れていれば、戻り値が1になります。

削除区分に'd'が設定された行は、削除されていますから、検索時は、
  "SELECT * FROM [Sheet1$] WHERE 郵便番号 = @yubinBango " + _
  "AND (削除区分 <> 'd' OR 削除区分 IS NULL)"

として、WHERE句で削除行を除外します。

それでは、削除ボタン押下時のソースリストを掲載します。

前号及び前々号で、Dim oDataSet As DataSet = New DataSet() を宣言してい
ましたが、oDataSetは使っていませんので不要です。この行をすべて削除しま
す。たいへん失礼しました。検索ボタン押下時の処理を再度掲載します。

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

Imports System.Data.OleDb

Public Class tblYBIdx
  Public Const zakuzyoKubun As Integer = 0
  Public Const yubinBango As Integer = 1
  Public Const todofukenMei As Integer = 2
  Public Const shichosonMei As Integer = 3
  Public Const choikiMei As Integer = 4
End Class

Public Class frmExcelDelete
  Inherits System.Windows.Forms.Form

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

  '★---------- 削除ボタン押下時の処理 ----------★
  Private Sub btnSakuzyo_Click( _
    ByVal sender As System.Object, ByVal e As System.EventArgs) _
    Handles btnSakuzyo.Click

    '---------- Excelシートの1行を論理的に削除する ----------
    Dim oConn As New OleDbConnection()
    Dim oCommand As New OleDbCommand()
    Dim oDataAdapter As New OleDbDataAdapter()
    Dim yubinBangoList As New DataTable()

    Try

      'DB接続文字列の設定
      oConn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0; " + _
      "Data Source=" + Application.StartupPath + "¥郵便番号簿.xls;" + _
      "Extended Properties=""Excel 8.0;HDR=YES;"""

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

      'SQL文の設定
      oCommand.CommandText = "UPDATE [Sheet1$] " + _
      "SET 削除区分='d' WHERE 郵便番号=@yubinBango"

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

      'UPDATEコマンドの設定
      oDataAdapter.UpdateCommand = oCommand

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

      'Excelブック更新処理実行
      Dim count As Integer
      count = oCommand.ExecuteNonQuery()

      '更新レコード数のチェック
      If count = 1 Then
        '画面を初期状態に戻す
        Me.lblKenmei.Text = ""
        Me.lblShicyosonMei.Text = ""
        Me.lblChoMei.Text = ""
        Me.txtYubinBango.Focus()
        Me.btnSakuzyo.Enabled = False
        MessageBox.Show( _
          "郵便番号簿から" + Me.txtYubinBango.Text + "の行を削除しました")
        Me.txtYubinBango.Text = ""
      Else
        MessageBox.Show("郵便番号簿の削除に失敗しました", "エラー")
      End If

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

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

  End Sub

  '---------- 検索ボタン押下時の処理(再掲) ----------
  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 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文の設定
      oCommand.CommandText = "SELECT * FROM [Sheet1$] " + _
      "WHERE 郵便番号 = @yubinBango " + _
      "AND (削除区分 <> 'd' OR 削除区分 IS NULL)"

      '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(tblYBIdx.todofukenMei))
        Me.lblShicyosonMei.Text = _
          CStr(yubinBangoList.Rows(0).Item(tblYBIdx.shichosonMei))
        Me.lblChoMei.Text = _
          CStr(yubinBangoList.Rows(0).Item(tblYBIdx.choikiMei))
        Me.btnSakuzyo.Enabled = True        '削除ボタンの活性化
      ElseIf yubinBangoList.Rows.Count = 0 Then
        '行データがなかった時の処理
        MessageBox.Show("郵便番号簿にデータがありません", "エラー")
        Me.lblKenmei.Text = ""
        Me.lblShicyosonMei.Text = ""
        Me.lblChoMei.Text = ""
        Me.txtYubinBango.Focus()
        Me.btnSakuzyo.Enabled = False        '削除ボタンの不活性化
      Else
        '行データが重複していた時の処理
        MessageBox.Show( _
          "郵便番号簿に同一郵便番号が2行以上あります", "エラー")
        Me.btnSakuzyo.Enabled = False        '削除ボタンの不活性化
      End If

    Catch oExcept As Exception
      '例外が発生した時の処理
      MsgBox(oExcept.ToString, MsgBoxStyle.OKOnly)
      '削除ボタンの不活性化
      Me.btnSakuzyo.Enabled = False

    End Try

  End Sub

End Class

----------------------------------------------------------------------
            ■■ 次号予告 第19号(12月15日頃発行予定) ■■

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.