バックナンバー 第87号:VB2008 データベースプログラミング

VB 2008 Express Editiont と、SQL Server 2008 Express with Advanced Services を使って、フォームから入力した受注データを、受注ヘッダー表と受注ディテール表に登録する、受注伝票エントリープログラムを作成していきます。
VB 2008
受注伝票エントリー 第15回(受注伝票アクセスクラス)
第87号(2010.8.25発行)
====================================================================
       ★★ -- VB.NETデータベースプログラミング奮闘記 -- ★★
           (VB 2008 Express & SQL Server 2008 Express)
--------------------------------------------------------------------
いつもご購読ありがとうございます。ADO.NETの基本的なサンプルプログラ
ムをお届けします。これからもよろしくお願いいたします。

やさしいVB2008 ADO.NET → https://adonetvb.com/index.html
====================================================================
                ■■ 受注伝票エントリー 第15回 ■■

フォームから入力した受注データを、受注ヘッダー表と受注ディテール表に
登録するプログラムを作成します。

フォーム    → https://adonetvb.com/OrderEntry/index.html

テーブル定義  → https://adonetvb.com/OrderEntry/DB.html

バックナンバー → https://adonetvb.com/MailMagazine/index.html

--------------------------------------------------------------------
                    ■ 受注伝票アクセスクラス ■

受注ヘッダー表と受注ディテール表にレコードを追加するInsertRecordメソ
ッドを実装します。

レコード追加では、TransactionScopeクラスを使用するので、受注ヘッダー
表、または受注ディテール表にレコードが追加できなかった時は、自動的に
ロールバックされます。

InsertRecordメソッドを、ClsJuchuDenpyoIO.vbに追加します。

--【プログラムソースリスト:ClsJuchuDenpyoIO.vb】-------------------
    '*******************************************************
    ' 機能:ヘッダー表とディテール表へのレコード追加メソッド
    ' 引数:追加する受注ヘッダー表データ
    ' 引数:追加する受注ディテール表データ
    ' 戻値:受注ディテール表に追加したレコード数
    '*******************************************************
    Public Function InsertRecord _
        (ByVal header As ClsInsertHeader, _
         ByVal meisai As List(Of ClsInsertDetailRow)) As Integer

        Dim retInsertCount As Integer          ' リターン値
        Dim addCount As Integer

        ' トランザクション開始
        Using tran As New TransactionScope
            Using con As New SqlConnection
                Using cmd As New SqlCommand

                    ' DBを開く
                    ClsHanbaiKanriDBIO.OpenDB(con, cmd)

                    ' 【受注ヘッダー表に追加】
                    ' SQL文の生成
                    cmd.CommandText = _
                    "INSERT INTO " & _
                    "受注ヘッダー表(受注番号, 受注日, " & _
                    "得意先コード) " & _
                    "VALUES(@bango, @juchuBi, @tokuCode)"

                    ' SQL文の引数設定
                    cmd.Parameters.Clear()
                    cmd.Parameters.Add _
                        ("@bango", SqlDbType.NChar)
                    cmd.Parameters.Add _
                        ("@juchuBi", SqlDbType.Date)
                    cmd.Parameters.Add _
                        ("@tokuCode", SqlDbType.NChar, 4)

                    ' 引数に値を設定
                    cmd.Parameters("@bango").Value _
                        = header.JuchuBango
                    cmd.Parameters("@juchuBi").Value _
                        = header.JuchuBi
                    cmd.Parameters("@tokuCode").Value _
                        = header.TokuisakiCode

                    ' 受注ヘッダー表へ追加
                    addCount = cmd.ExecuteNonQuery()

                    ' 戻り値が1以外なら例外をスローし、
                    ' 自動的にロールバック
                    If Not addCount = 1 Then
                        Throw New DBIOException _
                        ("受注ヘッダー表への追加失敗")
                    End If

                    ' 【受注ディテール表に追加】
                    ' SQL文の生成
                    cmd.CommandText = _
                    "INSERT INTO " & _
                    "受注ディテール表(受注番号, " & _
                    "受注行番号, 商品コード, 受注数量) " & _
                    "VALUES(@bango, @gyo, @hinCode, @suryo)"

                    ' SQL文の引数設定
                    cmd.Parameters.Clear()
                    cmd.Parameters.Add _
                        ("@bango", SqlDbType.NChar)
                    cmd.Parameters.Add _
                        ("@gyo", SqlDbType.SmallInt)
                    cmd.Parameters.Add _
                        ("@hinCode", SqlDbType.NChar, 5)
                    cmd.Parameters.Add _
                        ("@suryo", SqlDbType.Int)

                    ' 明細行を1行ずつ受注ディテール表に追加
                    For i As Integer = 0 To meisai.Count - 1
                        ' 引数に値を設定
                        cmd.Parameters("@bango").Value _
                            = header.JuchuBango
                        cmd.Parameters("@gyo").Value = i + 1
                        cmd.Parameters("@hinCode").Value _
                            = meisai(i).ShohinCode
                        cmd.Parameters("@suryo").Value _
                            = meisai(i).JuchuSuryo

                        ' 受注ディテール表へ追加
                        addCount = cmd.ExecuteNonQuery()

                        If addCount = 1 Then
                            ' 正常に受注ディテール表に追加
                            retInsertCount += 1
                        Else
                            ' 戻り値が1以外なら例外をスローし、
                            ' 自動的にロールバック
                            Throw New DBIOException _
                            ("受注ディテール表への追加失敗")
                        End If

                    Next i

                End Using
            End Using

            ' 正常にレコード追加完了
            ' トランザクション完了(コミット)
            tran.Complete()

        End Using

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

    End Function

--------------------------------------------------------------------
最後にクリアボタンクリック処理を実装して、受注伝票エントリーのプログ
ラムは完了です。

クリアボタンクリック処理を、FormJuchuEntryクラスに追加します。

--【プログラムソースリスト:FormJuchuEntry.vb】---------------------
    '*******************************************************
    ' クリアボタンクリック処理
    '*******************************************************
    Private Sub BtnClear_Click _
        (ByVal sender As System.Object, _
         ByVal e As System.EventArgs) Handles BtnClear.Click

        ' ヘッダー部データ初期化
        InitialHeader()
        ' ディテール部データ初期化
        InitialDetail()

    End Sub

--------------------------------------------------------------------
みなさんお疲れ様でした。次号からは、受注伝票エントリーで使用した既存
のDBアクセスクラスを再利用して、効率的なマスター保守プログラムを作
成していきます。

====================================================================
VB.NET データベースプログラミング奮闘記
  発行者:ウェブ実験室(adonet‾live.jp ‾はあっとマーク)
          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」
などホームページに掲載されている会社名・製品名等は、各社の登録商標ま
たは商標です。
====================================================================