すぐ使えるADO.NET

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

本の紹介

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

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




【第68号】

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

すぐ使えるADO.NET --> http://park5.wakwak.com/‾weblab/
--------------------------------------------------------------------
[やさしいVB2008 ADO.NET]を、新規に開設しました。内容はまだまだですが、
こちらもよろしくお願い致します。

やさしいVB2008 ADO.NET --> https://adonetvb.com/
====================================================================
                 ■■ 社員テーブルを更新する 3 ■■

社員コードを入力して、検索ボタンを押下すると、該当する社員レコードを
表示する。修正後、更新ボタンを押下すれば、入力データのエラーチェック
をして、エラーが無ければ、社員テーブルの該当レコードを更新する。

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

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

┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ 社員テーブル更新                _□×┃
┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃  Label1    TxtShainCode   BtnRetrieval
┃┌―――――┐ ┌―――――┐   ┌――――┐
┃│社員コード│ │     │   │ 検索 │
┃└―――――┘ └―――――┘   └――――┘
┃  Label2    TxtShainShimei
┃┌―――――┐ ┌――――――――┐
┃│社員氏名 │ │        │
┃└―――――┘ └――――――――┘
┃  Label3    TxtShainKana
┃┌―――――┐ ┌――――――――――――――┐
┃│社員カナ │ │              │
┃└―――――┘ └――――――――――――――┘
┃  Label4    CboBushoMei
┃┌―――――┐ ┌―――――――――┬―┐
┃│部署   │ │         │▼│
┃└―――――┘ └―――――――――┴―┘
┃ BtnUpdate    BtnClear
┃┌――――┐  ┌―――――┐
┃│ 更新 │  │ クリア │
┃└――――┘  └―――――┘
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

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

【クリアボタンクリック処理】(第66号)
社員コードと検索ボタンのEnableプロパティをTrue、他はFalseにして、入
出力項目を初期状態に戻します。

【更新ボタンクリック処理】(第67号)
入力データのエラーチェックをして、エラーがなければ、該当レコードを更
新します。

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

社員テーブルを更新するには、ClsShainTableIOクラスのUpdateKeyRecordメ
ソッドを呼び出します。

インターフェース宣言に、UpdateKeyRecordを追加しておきます。

Public Interface IDBIO
    Function UpdateRecord(ByVal Shain As ClsUpdateShain) As Integer
End Interface

レコード更新処理は、追加処理と同様に、TransactionScopeクラスのトラン
ザクション処理を使います。参照設定で、 System.Transactionsを追加して
ください。

取得時の更新日時と同じレコードが存在しない時は、他で更新または削除さ
れたとみなして、例外をスローします。そのために、UPDATEのSQL文に、

  "WHERE 社員コード = @sCode AND 更新日時 = @date"

を追加します。

TransactionScopeクラスを利用すれば、例外が発生しても、自動的にロール
バックされるので、ロールバックメソッドを呼び出す必要はありません。

トランザクションをコミットするためには、Completeメソッドを呼び出しま
す。

これで社員マスターの更新処理は完成です。

------【プログラムソースリスト(ClsShainTableIO.vbに追加)】--------
  '------------------------------------------------------------
  ' 機能:社員テーブルの1レコードを更新するメソッド
  ' 引数:ClsUpdateShainオブジェクト
  ' 戻値:更新成功時更新レコード数(その他はすべて例外スロー)
  '------------------------------------------------------------
  Public Function _
  UpdateKeyRecord(ByVal Shain As ClsUpdateShain) As Integer _
  Implements IDBIO.UpdateRecord

    Dim retUpdateCount As Integer                'リターン値

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

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

            '----------< SQL文の生成 >----------
            cmd.CommandText = _
            "UPDATE 社員テーブル " & _
            "SET 社員氏名 = @shimei, 社員カナ = @kana, " & _
            "部署コード = @bCode, 更新日時 = @newDate " & _
            "WHERE 社員コード = @sCode AND 更新日時 = @date"

            'SQL文の引数設定
            cmd.Parameters.Clear()
            cmd.Parameters.Add _
            (New SqlParameter("@sCode", SqlDbType.NChar, 5))
            cmd.Parameters.Add _
            (New SqlParameter("@shimei", SqlDbType.NVarChar, 20))
            cmd.Parameters.Add _
            (New SqlParameter("@kana", SqlDbType.NVarChar, 40))
            cmd.Parameters.Add _
            (New SqlParameter("@bCode", SqlDbType.NChar, 4))
            cmd.Parameters.Add _
            (New SqlParameter("@newDate", SqlDbType.DateTime))
            cmd.Parameters.Add _
            (New SqlParameter("@date", SqlDbType.DateTime))

            '引数に値を設定
            cmd.Parameters("@sCode").Value = Shain.ShainCode
            cmd.Parameters("@shimei").Value = Shain.ShainShimei
            cmd.Parameters("@kana").Value = Shain.ShainKana
            cmd.Parameters("@bCode").Value = Shain.BushoCode
            cmd.Parameters("@newDate").Value = Now()
            cmd.Parameters("@date").Value = Shain.KoushinNichiji

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

            'テーブルの更新を実行
            retUpdateCount = cmd.ExecuteNonQuery()

          End Using
        End Using

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

      End Using

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

    Catch ex As Exception
      Throw New Exception("例外発生:" & ex.ToString)

    End Try

    Return retUpdateCount    '◆リターン

  End Function


----------------------------------------------------------------------
本年もご購読ありがとうございました。来年は、売上入力や受注入力に使える
伝票入力を始める予定です。来年もよろしくお願い申し上げます。

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

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