すぐ使えるADO.NET

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

本の紹介

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

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




【第64号】

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

すぐ使えるADO.NET --> http://park5.wakwak.com/‾weblab/
======================================================================
                  ■■ 社員テーブルから削除する 2 ■■

社員コードを入力して、削除ボタンをクリックすると、入力した社員コードの
エラーチェックをし、エラーが無ければ、社員テーブルから該当するレコード
を削除します。

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

【sampleデータベースの部署テーブル】
----------------------------------------------------------------------
key  列 名   データ型    nullを許容  備 考
----------------------------------------------------------------------
○ 部署コード  nchar(4)       許容しない 英数字のみ
− 部署名    nvarchar(20)   許容しない
− 更新日時   datetime       許容しない
----------------------------------------------------------------------

┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ 社員テーブル削除                _□×┃
┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃  Label1    TxtShainCode   BtnRetrieval
┃┌―――――┐ ┌―――――┐   ┌――――┐
┃│社員コード│ │     │   │ 検索 │
┃└―――――┘ └―――――┘   └――――┘
┃  Label2    LblShainShimei
┃┌―――――┐ ┌――――――――┐
┃│社員氏名 │ │        │
┃└―――――┘ └――――――――┘
┃  Label3    LblShainKana
┃┌―――――┐ ┌――――――――――――――┐
┃│社員カナ │ │              │
┃└―――――┘ └――――――――――――――┘
┃  Label4    LblBushoMei
┃┌―――――┐ ┌――――――┐
┃│部署   │ │      │
┃└―――――┘ └――――――┘
┃ BtnDelete    BtnClear
┃┌――――┐  ┌―――――┐
┃│ 削除 │  │ クリア │
┃└――――┘  └―――――┘
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

【検索ボタンクリック処理】
入力した社員コードが、社員テーブルに存在すれば、該当レコードを表示して、
社員コードを入力不可に設定します。社員テーブルに存在しなければ、エラー
メッセージを表示します。

【クリアボタンクリック処理】
表示データを初期状態に戻します。

【削除ボタンクリック処理】
該当レコードを社員テーブルから削除します。

----------------------------------------------------------------------
                    ■■ 削除ボタンクリック処理 ■■

引数に社員コードを指定して、ClsShainTableIOクラスの DeleteKeyRecordメ
ソッドを呼び出して、社員テーブルの該当レコードを削除します。
エラーチェックは、DeleteKeyRecordメソッドで行います。エラーがあれば、
例外がスローされて、Catchブロックに分岐しますので、正常処理は、

      '削除メソッド呼び出し
      dbIO.DeleteKeyRecord(Me.TxtShainCode.Text)

      '正常削除後の処理
      ............

とコーディングすれば、すっきりします。


【修正】前号のFormDelete63.vbのソースを一部修正しました。
        ■の行が修正箇所です。お手数ですが確認をお願いします。

--【プログラムソースリスト(ファイル名:FormDelete63.vb)】-----------
Public Class FormDelete63

  '----------<< 削除ボタン押下処理 >>----------
  Private Sub BtnDelete_Click _
  (ByVal sender As System.Object, ByVal e As System.EventArgs) _
  Handles BtnDelete.Click

    Try
      Dim dbIO As New ClsShainTableIO()

      '削除メソッド呼び出し
      dbIO.DeleteKeyRecord(Me.TxtShainCode.Text)

      '正常処理メッセージ表示
      MessageBox.Show("正常終了", "削除処理結果")

      'フォーム初期設定
      Me.ClearForm()

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

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

    End Try

  End Sub

  '----------<< 検索ボタン押下処理 >>----------
  Private Sub BtnRetrieval_Click _
  (ByVal sender As System.Object, ByVal e As System.EventArgs) _
  Handles BtnRetrieval.Click

    Dim shainTable As New ClsShainTableIO
    Dim bushoTable As New ClsBushoTableIO
    Dim dt As New DataTable

    Try
      dt = shainTable.GetKeyData(Me.TxtShainCode.Text)

      If dt.Rows.Count = 1 Then
        '-----< レコードがあった時 >-----
        Me.LblShainShimei.Text = CStr(dt.Rows(0)("社員氏名"))
        Me.LblShainKana.Text = CStr(dt.Rows(0)("社員カナ"))
        '部署名取得
        Dim dtBusho As New DataTable
        dtBusho = bushoTable.GetKeyData(CStr(dt.Rows(0)("部署コード")))
        Me.LblBushoMei.Text = CStr(dtBusho.Rows(0)("部署名"))

        '社員コード入力不可
        Me.TxtShainCode.Enabled = False
        Me.BtnRetrieval.Enabled = False    '■追加
        Me.BtnDelete.Enabled = True        '■追加

      Else
        '-----< レコードが無い時 >-----
        MessageBox.Show _
        ("入力した社員コードのデータがありません", "入力エラー")

      End If

    Catch ex As myDBIOException
      'DBIO独自例外発生時
      MessageBox.Show(ex.Message, "エラー発生")

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

    End Try

  End Sub

  '----------<< クリアボタン押下処理 >>----------
  Private Sub BtnClear_Click _
  (ByVal sender As System.Object, ByVal e As System.EventArgs) _
  Handles BtnClear.Click

    'フォーム初期化
    Me.ClearForm()

  End Sub

  '----------<< フォーム初期化 >>----------
  Private Sub ClearForm()

    Me.TxtShainCode.Text = Nothing
    Me.LblShainShimei.Text = Nothing
    Me.LblShainKana.Text = Nothing
    Me.LblBushoMei.Text = Nothing

    '社員コード入力可能
    'Me.TxtShainCode.ReadOnly = False  '■削除
    'Me.TxtShainCode.TabStop = True    '■削除
    Me.TxtShainCode.Enabled = True     '■追加
    Me.BtnRetrieval.Enabled = True     '■追加
    Me.BtnDelete.Enabled = False       '■追加

    '社員コードにフォーカス
    Me.TxtShainCode.Focus()

  End Sub

End Class

----------------------------------------------------------------------
       ■■ ClsShainTableIOクラスのDeleteKeyRecordメソッド ■■

DeleteKeyRecordメソッドをClsShainTableIOクラスに実装します。

ClsShainTableIOクラスのDeleteKeyRecordメソッドでは、キー値レコードの存
在チェックするExistKeyDataメソッドを呼び出します。このメソッドの中で、
キー値エラーチェックをしているので、DeleteKeyRecordメソッド内では、エ
ラーチェックをしていません。

キー値のレコードが存在すれば、基本クラスClsSampleDBIOクラスの
DeleteKeyRecordメソッドを呼び出して、引数に指定した社員コードのレコー
ドを削除します。

ClsShainTableIO.vbファイルに追加します。
--【プログラムソースリスト】------------------------------------------
Imports System.Configuration   '参照の追加でSystem.Configurationを追加
Imports System.Data.SqlClient
Imports System.Text.RegularExpressions
Imports System.Transactions    '参照の追加でSystem.Transactionsを追加

Public Class ClsShainTableIO
  Inherits ClsSampleDBIO
  Implements IDBIO

  '(中略)

  '*******************************************************************
  ' 機能:社員テーブルから1レコードを削除するメソッド
  ' 引数:社員コード(String型)
  ' 返値:integer型:削除したレコード数
  '******1*********2*********3*********4*********5**********6*********
  Public Overloads _
  Function DeleteKeyRecord(ByVal KeyCode As String) As Integer

    Dim retDeleteCount As Integer                'リターン値

    Try
      'キー値のレコード存在チェック
      If Me.ExistKeyData(KeyCode) = True Then
        '存在すれば、レコード削除
        retDeleteCount = _
        MyBase.DeleteKeyRecord("社員テーブル", "社員コード", KeyCode)
      Else
        '存在しなければ、例外をスロー
        Throw New myDBIOException _
        ("エラー:社員コードのレコードが存在しません")
      End If

    Catch ex As Exception
      '例外が発生したら、例外をスロー
      Throw New Exception("例外発生:" & ex.ToString)

    End Try

    '◆リターン
    Return retDeleteCount

  End Function

  '*******************************************************************
  ' 機能:社員テーブルキー値のレコードの有無を調べるメソッド
  ' 引数:主キー値
  ' 戻値:レコードあり-->True、レコードなし-->False
  ' 補足:テーブル名の主キーフィールドはNChar型とする
  '******1*********2*********3*********4*********5**********6*********
  Public Overloads _
  Function ExistKeyData(ByVal KeyCode As String) As Boolean

    Dim retExist As Boolean                      'リターン値

    Try
      '引数Nothing(未設定)・空白チェック
      If KeyCode Is Nothing Or KeyCode = "" Then
        Throw New myDBIOException("エラー:社員コードが未設定")
      End If

      '引数の前後の空白は除去する
      KeyCode = KeyCode.Trim()

      'キー値文字チェック(キー値は英数字のみで構成されている)
      If Not Regex.IsMatch(KeyCode, "^[0-9a-zA-Z]+$") Then
        '英数字以外はエラー
        Throw New myDBIOException _
        ("エラー:社員コードに不正な文字あり")
      End If

      'キー値長さチェック(社員コードは5桁)
      If Not KeyCode.Length = 5 Then
        '5桁以外はエラー
        Throw New myDBIOException _
        ("エラー:社員コードの桁数が正しくない")
      End If

      '社員テーブルから引数コードのレコードの有無をチェックする
      retExist = _
      MyBase.ExistKeyData("社員テーブル", "社員コード", KeyCode)

    Catch ex As myDBIOException
      Throw New myDBIOException(ex.Message)

    Catch ex As Exception
      Throw New Exception _
      ("ClsShainTableIOのExistKeyDataで例外発生:" & ex.ToString)

    End Try

    '◆戻値を設定してリターン
    Return retExist

  End Function

End Class

----------------------------------------------------------------------
次号では、基本クラスClsSampleDBIOの削除メソッドDeleteKeyRecordを実装し
ます。引数にテーブル名、キーフィールド名、キー値を指定して、汎用的に利
用できるようにします。

======================================================================
VB.NET データベースプログラミング奮闘記
  発行者:ウェブ実験室([email protected])
          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.