すぐ使えるADO.NET

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

本の紹介

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

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




【第72号】

第72号(2009.4.30発行)
====================================================================
                           【お詫び】
70号と71号に掲載漏れがありました。皆様にお詫び申し上げます。

今後はミスのないよう努力しますので、これからも「VB.NETデータベースプ
ログラミング奮闘記」よろしくお願い致します。


--【 第70号プログラムソース(ClsShain.vb)】------------------------
'////////// ClsShainBaseクラスに追加 //////////
    '********************************************************
    ' 機能:社員テーブルの行データ生成
    ' 引数:なし
    ' 返値:生成した行データ
    '****1*********2*********3*********4*********5**********6
    Public Function CreateDataRow() As DataRow

        Dim retRow As DataRow              ' リターン値
        Dim dbIO As New ClsShainTableIO

        retRow = dbIO.CreateDataRow()
        Return retRow

    End Function

--【 第70号プログラムソース(ClsShainTableIO.vb)】-----------------
'////////// ClsShainTableIOクラスに追加 //////////
    '********************************************************
    ' 機能:社員テーブルの行データ生成
    ' 引数:なし
    ' 返値:生成した行データ
    '****1*********2*********3*********4*********5**********6
    Public Overloads Function CreateDataRow() As DataRow

        Dim retRow As DataRow            ' リターン値

        retRow = MyBase.CreateDataRow("社員テーブル", "社員コード")
        Return retRow

    End Function

--【 第71号プログラムソース(ClsBushoTableIO.vb)】-----------------
'////////// ClsBushoTableIOクラスに追加 //////////
    '********************************************************
    ' 機能:部署テーブルから引数にした列名の全レコードを取得
    ' 引数:部署テーブルの取得する列名(配列)
    ' 引数:任意 整列する列名
    ' 引数:任意 昇順・降順指定(昇順ならTrue、降順ならFalse)
    ' 戻値:引数に指定した列名の全レコード
    '****1*********2*********3*********4*********5**********6
    Public Overloads _
    Function GetAllData _
             (ByVal columns() As String, _
              Optional ByVal sortKey As String = Nothing, _
              Optional ByVal sorted As Boolean = True _
             ) As DataTable

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

        ' 引数Nothing(未設定)・空白チェック
        If columns.Length = 0 Then
            Throw New myDBIOException("エラー:引数Columnsが未設定")
        End If

        ' 部署テーブルから引数列名の全レコードを取得する
        retDt = MyBase.GetAllData _
        ("部署テーブル", columns, sortKey, sorted)

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

    End Function

--【 第71号プログラムソース(ClsSampleDBIO.vb)】-----------------
'////////// ClsSampleDBIOクラスに追加 //////////
    '********************************************************
    ' 機能:引数に指定したテーブルの全レコードを取得する
    ' 引数:必須 ByVal テーブル名(String型)
    ' 引数:必須 ByVal 取得する列名(String型配列)
    ' 引数:任意 ByVal 整列する列名(String型)
    ' 引数:任意 ByVal 昇順ならTrue、降順ならFalse(Boolean型)
    ' 戻値:引数に指定したテーブルの全レコード(DataTble型)
    '****1*********2*********3*********4*********5**********6
    Public Function GetAllData _
                    (ByVal TableName As String, _
                     ByVal Columns() As String, _
                     Optional ByVal SortKey As String = Nothing, _
                     Optional ByVal Sorted As Boolean = True _
                    ) As DataTable

      Dim retDt As New DataTable()    '戻値の生成

      Using con As New SqlConnection
        Using cmd As New SqlCommand
          ' 引数が未設定だったら例外をスロー
          If TableName = Nothing Then
              Throw New myDBIOException _
                  ("引数エラー:TableNameが未設定")
          End If
          If Columns.Length = 0 Then
              Throw New myDBIOException _
                  ("引数エラー:Columnsが未設定")
          End If

          '----------< テーブル名取得、列名取得 >----------
          Dim dtTableName As DataTable
          Dim dtColumns As DataTable

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

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

          ' テーブル名を取得
          dtTableName = con.GetSchema("Tables")
          ' 列名取得
          dtColumns = con.GetSchema _
          ("Columns", New String() {Nothing, Nothing, TableName, Nothing})

          ' DB接続を閉じる
          con.Close()

          '----------< SQL文の生成 >----------
          Dim existFlg As Boolean = False

          cmd.Parameters.Clear()
          cmd.CommandText = "SELECT "
          ' 列名の設定
          If Columns(0) = "*" Then
              ' 全列名指定の場合
              cmd.CommandText &= Columns(0) & " "
          Else
            ' 特定列名指定の場合
            For i As Integer = 0 To Columns.Length - 1
              ' 列名存在チェック
              For j As Integer = 0 To dtColumns.Rows.Count - 1
                If Columns(i) = _
                dtColumns.Rows(j)("COLUMN_NAME").ToString Then
                    existFlg = True
                    Exit For
                End If
              Next j

              ' 列名が存在すれば、SQL文に連結
              If existFlg = True Then
                  cmd.CommandText &= Columns(i)
                  ' 最後の列名以外「,」を連結
                  If i < Columns.Length - 1 Then
                      cmd.CommandText &= ","
                  End If
                  existFlg = False
              Else
                  ' 列名が存在しなければ、例外をスロー
                  Throw New myDBIOException _
                      ("エラー:" & Columns(i) & "の列名は存在しない")
              End If
            Next i
          End If

          ' テーブル名の設定
          For i As Integer = 0 To dtTableName.Rows.Count - 1
              ' テーブル名存在チェック
              If TableName = _
                  dtTableName.Rows(i)("TABLE_NAME").ToString Then
                  existFlg = True
                  Exit For
              End If
          Next i

          ' テーブル名が存在すれば、テーブル名をSQL文に連結
          If existFlg = True Then
              cmd.CommandText &= " FROM " & TableName
          Else
              ' テーブル名が存在しなければ、例外をスロー
              Throw New myDBIOException _
                  ("エラー:" & TableName & "は存在しない")
          End If

          ' 整列の指定
          If Not SortKey = Nothing Then
              For i As Integer = 0 To Columns.Length - 1
                ' 整列キーの列名存在チェック
                If SortKey = _
                dtColumns.Rows(i)("COLUMN_NAME").ToString Then
                    existFlg = True
                    Exit For
                End If
              Next i

              ' 整列キーの列名が存在すれば、列名をSQL文に連結
              If existFlg = True Then
                  cmd.CommandText &= " ORDER BY " & SortKey
                  ' 整列キーの昇順または降順をSQL文に連結
                  If Sorted = True Then
                      cmd.CommandText &= " ASC"
                  Else
                      cmd.CommandText &= " DESC"
                  End If
              Else
                  ' 整列キーの列名が存在しなければ、例外をスロー
                  Throw New myDBIOException _
                      ("エラー:" & SortKey & "の列名は存在しない")
              End If
          End If

          ' テーブルから全レコード取得
          Dim da As New SqlDataAdapter
          da.SelectCommand = cmd
          da.Fill(retDt)

        End Using
      End Using

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

    End Function

--【 第71号プログラムソース(ClsShain.vb)】------------------------
'////////// ClsShainBaseクラスに追加 //////////
    '----------<< メンバ:変数 >>----------
    Private BushoCodeValue As String

    '--------------------------------------------------------
    ' プロパティ:部署コード
    '--------------------------------------------------------
    Public Property BushoCode() As String

        ' Getプロパティ
        Get
            Return bushoCodeValue
        End Get

       ' Setプロパティ
        Set(ByVal value As String)
            ' 【エラーチェック】
            If value.Length = 0 Then
                ' 未入力はエラー
                Throw New myBushoCodeException _
                ("部署コードを入力してください")
            Else
                ' 数字なら正常
                If Regex.IsMatch(value, "^[0-9]+$") Then
                    Dim dbIO As New ClsBushoTableIO
                    ' 部署マスタにあれば正常
                    If dbIO.ExistKeyData(value) = True Then
                        bushoCodeValue = value
                    Else
                        Throw New myBushoCodeException _
                          ("部署コードはありません")
                    End If
                Else
                    Throw New myBushoCodeException _
                      ("部署コードに数字以外の文字があります")
                End If
            End If
        End Set

    End Property

    ' ★第70号で追加していれば、追加する必要なし
    '**********************************************************
    ' 機能:社員テーブルの行データ生成
    ' 引数:なし
    ' 返値:生成した行データ
    '******1*********2*********3*********4*********5**********6
    Public Function CreateDataRow() As DataRow

        Dim retRow As DataRow              ' リターン値
        Dim dbIO As New ClsShainTableIO

        retRow = dbIO.CreateDataRow()

        Return retRow

    End Function

' ★クラス全体を追加
'//////// ClsShainSubクラス ////////
Public MustInherit Class ClsShainSub
    Inherits ClsShainBase

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

        MyBase.New()   ' 基本クラスのコンストラクタを呼び出す

    End Sub

    '=======================================================
    ' 機能:コンストラクタ
    ' 引数:社員コード
    '=======================================================
    Protected Sub New(ByVal shainCode As String)

        MyBase.New()  ' 基本クラスのコンストラクタを呼び出す
        ' ---<< 社員テーブルからレコード取得 >>---
        Dim shainTable As New ClsShainTableIO
        Dim dt As DataTable

        ' レコード取得メソッド呼出
        dt = shainTable.GetKeyData(shainCode)
        If dt.Rows.Count = 1 Then
            ' レコードがあった時
            MyBase.ShainCodeValue = shainCode
            MyBase.ShainShimei = CStr(dt.Rows(0)("社員氏名"))
            MyBase.ShainKana = CStr(dt.Rows(0)("社員カナ"))
            MyBase.BushoCode = CStr(dt.Rows(0)("部署コード"))
            MyBase.KoushinNichijiValue = _
            CDate(dt.Rows(0)("更新日時"))
        Else
            ' レコードが無かった時
            Throw New myShainCodeException _
            ("社員テーブルにレコードがありません")
        End If

    End Sub

    '--------------------------------------------------------
    ' プロパティ:社員コード
    '--------------------------------------------------------
    Public ReadOnly Property ShainCode() As String

        ' Getプロパティ
        Get
            Return shainCodeValue
        End Get
    End Property

End Class


====================================================================
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」「やさしいBV2008 ADO.NET」
などのホームページで公開しているソースプログラム・データの利用により
生じた損害等については、発行者は一切責任を負いません。ソースプログラ
ムの再利用は自由です。著作権は発行者が所有します。
このメールマガジン及び「すぐ使えるADO.NET」「やさしいBV2008 ADO.NET」
などホームページに掲載されている会社名・製品名等は、各社の登録商標ま
たは商標です。
====================================================================

Copyright© すぐ使えるADO.NET. All rights reserved.