| ホーム | 掲示板 | 特集 | サンプル | Tips | リンク | その他 | blog 

Tips
[VS2003]
 日付時刻の演算
 ListBoxにファイル一覧
 ファンクションF10
 WMIでサービス一覧
 YAHOO検索エンジン
[VS2005]
 Administrator権限チェック
 非同期ExecuteReader
 非同期ExecuteReader(CallBack)
 パスの結合
 ファイルを圧縮して保存
 コントロール配列の実装
 DataGridViewのCellイベント
 CSVファイルをDataGridViewに表示
 DataGridViewのリンクセルを見やすく
 DataGridViewマウス右ボタンで選択
 DataGridViewスクロール制御
 DataGridViewのCell移動をEnterで
 DataRepeaterコントロール
 GZ圧縮ファイルを解凍
 ファイルの削除
 ディレクトリ有無チェック
 ファイルのダウンロード
 非同期ファイルダウンロード
 ドライブの一覧
 ファイルのコピー
 ファイル有無チェック
 テキストファイルを読み込む
 特定の文字列を含むファイル検索
 フォームを表示(Show)する
 フォルダ一覧取得
 ドライブ詳細情報取得
 ファイル一覧取得
 テンポラリファイルパス取得
 継承コントロールの作り方
 フォルダの移動
 ファイルの移動
 My.Settingの利用
 MySQLCommandで抽出
 MySQLDeleteCommandで削除
 MySQLInsertCommandで挿入
 MySQLSelectCommandで抽出
 MySQLUpdateCommandで更新
 ネットワークに繋がってる?
 ネットワーク接続イベント取得
 固定長テキストファイルを読む
 Oracleストアドファンクション呼出1
 Oracleストアドファンクション呼出2
 OracleのLong Row型の画像を表示
 OracleのLong Row型をファイル保存
 Oracleパラメータクエリ実行
 ORACLE接続文字列生成
 VS2005でPing
 非同期でPing
 VB6のPrinterオブジェクトを.NETで
 Reportでテーブル形式表示
 ReportViewerでパラメータ設定
 メール送信
 非同期でメール送信
 メール送信(MailMessage利用)
 シリアル通信プログラム
 シリアル通信(文字列送信)
 二重起動の禁止
 特殊フォルダ取得
 スプラッシュウインドウ表示
 テーブルへ複数行の挿入
 CSVファイルをテーブルへ挿入
 テーブルへ複数行の挿入(マッピング)
 SqlBulkCopyで郵便番号データ処理
 SQL Server接続文字列生成
 Stopwatchで時間の計測
 システムサウンド再生
 CSVファイル読み込み
 固定長テキストファイルを読む2
 TableAdapterでTransaction
[VS2005] TableAdapterでTransaction 2006/12/18
TableAdapterを利用してトランザクション処理を行う場合には、TransactionScopeを利用しますが、 MS DTC(Microsoft Distributed Transaction Coordinator)が利用できない場合など、TransactionScopeを利用しないでトランザクションを実装しなければ ならない事があります。このときに、どうのようにTableAdapterを利用するのかを説明します。  
以下、説明では、Northwindを利用しますので、適宜環境を整えてください。
 
■データソースを追加する
プロジェクトにデータソースを追加します。追加する内容は、NorthwindのCustomersテーブルです。
 

 
■TableAdapterに独自機能(トランザクション)を実装する
トランザクションを行うには、コネクションオブジェクトのBeginTransactionメソッドを実行してトランザクションを開始し、CommitまたはRollbackメソッドにて処理を確定 しなければなりません。これらをスムーズに行えるようにTableAdapterに独自のメソッドを実装します。
ここで威力を発揮するのが、Partialクラスです。Partialクラスを利用せずに、自動生成されたNorthwindDataSet.Designer.vbのコード内に実装することも可能ですが、 これをしてしまうと、Customersテーブルのレイアウトが変更になり、再生成してしまうと、せっかく独自で実装したコードが全て消えてしまいます。
なので、クラスを分離できるPartialクラスを利用して、独自コードを自動で変更されないように実装します。
コードを追加するには、
 

 
データテーブルの上で右クリック、「コードの表示」で表示されます。表示された時点では、DataTableのPartialクラスが表示されていますが、これらは適宜名前空間 ・クラス名などを指定して利用して下さい。
今回は、TableAdapterのPartialクラスを作成するので、名前空間は「NorthwindDataSetTableAdapters」、クラス名は「CustomersTableAdapter」になります。
 
実装するコードは、
Imports System.Data.SqlClient

Namespace NorthwindDataSetTableAdapters
    Partial Class CustomersTableAdapter
        ''' <summary>
        ''' コネクションをオープンする
        ''' </summary>
        ''' <returns>オープンされたコネクション</returns>
        ''' <remarks></remarks>
        Public Function OpenConnection() As SqlConnection
            If (Me._connection Is NothingThen
                Me.InitConnection()
            End If
            If Me._connection.State <> ConnectionState.Open Then
                Me._connection.Open()
            End If
            Return Me._connection
        End Function

        ''' <summary>
        ''' コネクションをクローズする
        ''' </summary>
        ''' <remarks></remarks>
        Public Sub CloseConnection()
            Me._connection.Close()
        End Sub

        ''' <summary>
        ''' トランザクションを開始する
        ''' </summary>
        ''' <param name="con">対象コネクション</param>
        ''' <returns>トランザクション</returns>
        ''' <remarks></remarks>
        Public Function BeginTransaction(ByVal con As SqlConnection) As SqlTransaction
            ''トランザクション開始
            Dim tran As SqlTransaction = con.BeginTransaction
            ''各コマンドにトランザクションをセット
            If (Not (Me.Adapter.InsertCommand) Is NothingThen
                Me.Adapter.InsertCommand.Transaction = tran
            End If
            If (Not (Me.Adapter.DeleteCommand) Is NothingThen
                Me.Adapter.DeleteCommand.Transaction = tran
            End If
            If (Not (Me.Adapter.UpdateCommand) Is NothingThen
                Me.Adapter.UpdateCommand.Transaction = tran
            End If
            Dim i As Integer = 0
            Do While (i < Me.CommandCollection.Length)
                If (Not (Me.CommandCollection(i)) Is NothingThen
                    CType(Me.CommandCollection(i), System.Data.SqlClient.SqlCommand).Transaction = tran
                End If
                i = (i + 1)
            Loop
            Return tran
        End Function
    End Class
End Namespace
このようになります。これは簡単な例なので、仕様により、色々な付加機能を実装することがありますので・・・
 
■利用方法
ボタンを押したら、新規Customerを追加する簡単な処理を、トランザクションを利用して実装する方法です。
Imports System.Data.SqlClient

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) _
                                                                        Handles Button1.Click

        Using taCustomers As New NorthwindDataSetTableAdapters.CustomersTableAdapter
            Dim con As SqlConnection = Nothing
            Dim tran As SqlTransaction = Nothing
            Try
                con = taCustomers.OpenConnection
                tran = taCustomers.BeginTransaction(con)
                taCustomers.Insert("12345""CompanyName""ContactName""ContactTitle", _
                                   "Address""City""Region""9999""JP", _
                                   "999-999-9999""999-999-9999")
                tran.Commit()
            Catch ex As SqlException
                tran.Rollback()
                MessageBox.Show(ex.Message, "SQLエラー", _
                            MessageBoxButtons.OK, MessageBoxIcon.Error)
            Catch ex As Exception
                tran.Rollback()
                MessageBox.Show(ex.Message, "一般エラー", _
                            MessageBoxButtons.OK, MessageBoxIcon.Error)
            Finally
                taCustomers.CloseConnection()
            End Try
        End Using

    End Sub
End Class

Copyright © 2005 tadahiro higuchi. All Rights Reserved.