DBアクセスクラス[削除]

Visual Basic ADO.NET [Community Express]

レコード削除メンバー実装

DBアクセス基本クラスの社員マスター表のレコード削除に必要なメンバーを実装します。

サンプルプログラム

クラス図

社員テーブルレコード削除に必要なDBアクセス基本クラスのメンバーは次のとおりです。

  • コンストラクタ(引数:なし)
  • キー値のレコード存在をチェックするメソッド(引数:テーブル名、キー列名、キー値)
  • 引数に指定したテーブルのキー値のレコードを取得するメソッド(引数:テーブル名、キー列名、キー値)
  • 引数に指定したテーブルのキー値のレコードを削除するメソッド(引数:テーブル名、キー列名、キー値)
  • 行データ生成メソッド(引数:テーブル名、キー列名)
  • 接続関連プロパティ設定メソッド(引数:参照 SqlConnectionオブジェクト、参照 SqlCommandオブジェクト)
社員マスター表
Key 列名 データ型 NULLを許容
社員コード nchar(5) しない
社員氏名 nvarchar(20) しない
社員カナ nvarchar(40) しない
部署コード nchar(4) しない
更新日時 datetime しない

ソースリストの枠内をクリックすると全選択できます。

Option Strict On
Imports System.Configuration       ' [参照の削除]から削除
Imports System.Data.SqlClient
Imports System.Transactions        ' [参照の削除]から削除

'////////// 基本クラス:sampleDBアクセスクラス //////////
Public MustInherit Class ClsSampleDBIO

  '====================================================================
  ' 機能:コンストラクタ
  ' 引数:なし
  '====================================================================
  Public Sub New()

      MyBase.New()

  End Sub

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

      Dim retExist As Boolean      ' リターン値

      Using con As New SqlConnection
          Using cmd As New SqlCommand
              ' 接続関連プロパティ設定
              Me.SetConnection(con, cmd)

              ' SQL文設定
              cmd.CommandText = "SELECT COUNT(*) FROM " & _
                  tableName & " WHERE " & keyField & " = @KeyCode"

              ' SQL文の引数設定
              cmd.Parameters.Clear()
              ' パラメータの実際のサイズからデータ長を推論
              cmd.Parameters.Add("@KeyCode", SqlDbType.NChar)
              ' コマンド引数に値を設定
              cmd.Parameters("@KeyCode").Value = keyCode

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

              ' レコード件数取得
              Dim count As Integer = CInt(cmd.ExecuteScalar())

              If count = 1 Then
                  ' レコードが1件あれば、Trueを返す
                  retExist = True
              Else
                  ' そうでなければ、Falseを返す
                  retExist = False
              End If

          End Using
      End Using

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

  End Function

  '**********************************************************
  ' 機能:引数に指定したキー値のレコードを取得する
  ' 引数:テーブル名
  ' 引数:キー列名
  ' 引数:キー値
  ' 戻値:取得したレコード
  ' 補足:キー列はNChar型とする
  '******1*********2*********3*********4*********5**********6
  Public Function GetKeyData(ByVal tableName As String, _
                             ByVal keyField As String, _
                             ByVal keyCode As String) As DataTable

      Dim retDt As New DataTable    'リターン値

      '----------<< テーブルからレコード取得 >>----------
      Using con As New SqlConnection
          Using cmd As New SqlCommand
              ' 接続関連プロパティ設定
              Me.SetConnection(con, cmd)

              ' SQL文設定
              cmd.CommandText = "SELECT * FROM " & _
                  tableName & " WHERE " & keyField & " = @keyCode"

              ' SQL文の引数設定
              cmd.Parameters.Clear()
              ' パラメータの実際のサイズからデータ長を推論
              cmd.Parameters.Add("@keyCode", SqlDbType.NChar)
              ' コマンド引数に値を設定
              cmd.Parameters("@KeyCode").Value = keyCode

              ' レコード取得
              Dim da As New SqlDataAdapter
              da.SelectCommand = cmd
              da.Fill(retDt)

          End Using
      End Using

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

  End Function

  '********************************************************************
  ' 機能:引数に指定したキー値のレコードを削除する
  ' 引数:テーブル名
  ' 引数:キー列名
  ' 引数:キー値
  ' 戻値:削除したレコード数
  ' 補足:キー列はNChar型とする
  '******1*********2*********3*********4*********5**********6*********7
  Public Function DeleteKeyData(ByVal tableName As String, _
                                ByVal keyField As String, _
                                ByVal keyCode As String) As Integer

      Dim retDeleteCount As Integer    'リターン値

      '----------<< レコード削除 >>----------
      ' トランザクション開始
      Using tran As New TransactionScope
        Using con As New SqlConnection
          Using cmd As New SqlCommand
              ' 接続関連プロパティ設定
              Me.SetConnection(con, cmd)

              ' SQL文設定
              cmd.CommandText = "DELETE FROM " & tableName & _
                  " WHERE " & keyField & " = @keyCode"

              ' SQL文の引数設定
              cmd.Parameters.Clear()
              ' パラメータの実際のサイズからデータ長を推論
              cmd.Parameters.Add("@keyCode", SqlDbType.NChar)
              ' コマンド引数に値を設定
              cmd.Parameters("@KeyCode").Value = keyCode

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

              ' レコード削除を実行
              retDeleteCount = cmd.ExecuteNonQuery()

          End Using
        End Using

        If retDeleteCount = 1 Then
            ' 1レコード削除なら正常(通常これしかありえない)
            ' トランザクション完了(コミット)
            tran.Complete()
        Else
            ' 1レコード削除以外なら例外をスロー
            ' コミットしなければ、自動的にロールバックされる
            Throw New myDBIOException _
                ("エラー:削除処理に失敗")
        End If

      End Using

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

  End Function

  '********************************************************************
  ' 機能:引数に指定した行データ生成
  ' 引数:テーブル名
  ' 引数:キー列名
  ' 戻値:生成した行データ
  '******1*********2*********3*********4*********5**********6*********7
  Public Function CreateDataRow(ByVal tableName As String, _
                                ByVal keyField As String) As DataRow

      Dim retRow As DataRow            ' リターン値
      Dim dt As New DataTable

      ' 列情報を取込むために、レコードを取得するが
      ' 取得できなくてもよいので、第三引数のキー値は何でも良い
      dt = Me.GetKeyData(tableName, keyField, "_")
      retRow = dt.NewRow

      Return retRow

  End Function

  '**********************************************************
  ' 機能:接続関連プロパティ設定
  ' 引数:参照 SqlConnectionオブジェクト
  ' 引数:参照 SqlCommandオブジェクト
  ' 戻値:なし
  '******1*********2*********3*********4*********5**********6
  Public Sub SetConnection(ByRef con As SqlConnection, _
                           ByRef cmd As SqlCommand)

      Dim settings As ConnectionStringSettings

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

      If settings Is Nothing Then
          ' 接続文字列取得エラー
          Throw New Exception("接続文字列がapp.configに未登録")
      Else
          ' 接続文字列の設定
          con.ConnectionString = settings.ConnectionString

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

  End Sub

End Class

sec_h2

sec_p