Interstage Shunsaku Data Manager アプリケーション開発ガイド - Microsoft(R) Windows(R) 2000/ Microsoft(R) Windows Server(TM) 2003 - - UNIX共通 -
目次 索引 前ページ次ページ

第1部 アプリケーション開発の基本> 第5章 トランザクション機能

5.3 .NET APIでトランザクションを使う

.NET APIを利用したアプリケーションの作成例を説明します。

XML文書の削除および更新を1トランザクションとして扱う例を以下に示します。

[図: XML文書の削除および更新を1トランザクションとして扱う例]

■C# .NETでの記述例

/*
 * 以下のように用意されていることを仮定しています。
 *  sQuery :検索式を格納した文字列
 *  sReturn :リターン式を格納した文字列
 *  updateData :更新データを格納した文字列
 */

ShunService service = null; 

try {
  // ShunServiceを作成
  service = new ShunService();
  service.Host = "DirSvr1";
  service.Port = 33101; 
  service.Connect();

  // ShunSearchRequirementを作成
  ShunSearchRequirement req = new ShunSearchRequirement();
  req.QueryExpression  = sQuery; 
  req.ReturnExpression = sReturn; 
  req.ReplyNumber      = 1;
  req.RequestCount     = 30; 

  // 検索を実行
  ShunResultSet rs = service.Search( req ); 

  // 自動コミットを無効に切替え
  service.AutoCommit = false;                                            (1)

  try {
    // 3番目のデータを削除対象に設定
    ShunRecordCollection deleteRecCol = new ShunRecordCollection();
    deleteRecCol.Add( rs.Records[2] ); 
    
    // データを削除
    service.Delete( deleteRecCol ); 
    
    // 5番目のデータを更新対象に設定
    ShunRecordCollection updateRecCol = new ShunRecordCollection();
    ShunRecord record = rs.Records[4]; 
    record.Data = updateData; 
    updateRecCol.Add( record ); 
    
    // データを更新
    service.Update( updateRecCol ); 
    
    // コミットの実行
    service.Commit();                                                    (2)
  }
  catch {
    if ( service.State == ShunConnectionState.Open ) {
      // ロールバックの実行
      service.Rollback();                                               (3)
    }
    throw;
  }
  service.Disconnect();
}
catch ( ShunContinuousException e ) {
  // ShunContinuousExceptionが発生した場合の処理を記述
  try {
    if( service != null && service.State == ShunConnectionState.Open ) {
      service.Disconnect();
    }
  }
  catch( ShunException ex ) {
    Console.WriteLine("エラーメッセージ : {0}", ex.Message );
  }
  Console.WriteLine("エラーメッセージ : {0}", e.Message );
}
catch ( ShunTransactionRolledbackException e ) {
  // ShunTransactionRolledbackExceptionが発生した場合の処理を記述
  try {
    if( service != null && service.State == ShunConnectionState.Open ) {
      service.Disconnect();
    }
  }
  catch( ShunException ex ) {
    Console.WriteLine("エラーメッセージ : {0}", ex.Message );
  }
  Console.WriteLine("エラーメッセージ : {0}", e.Message );
}
catch ( ShunConnectionTerminatedException e ) {
  // ShunConnectionTerminatedExceptionが発生した場合の処理を記述
  Console.WriteLine("エラーメッセージ : {0}", e.Message );
}

■VB .NETでの記述例

' 以下のように用意されていることを仮定しています。
' sQuery :検索式を格納した文字列
' sReturn :リターン式を格納した文字列
' updateData :更新データを格納した文字列

Dim service As ShunService = Nothing

Try
  ' ShunServiceを作成
  service = New ShunService()
  service.Host = "DirSvr1"
  service.Port = 33101
  service.Connect()

  ' ShunSearchRequirementを作成
  Dim req As ShunSearchRequirement = New ShunSearchRequirement()
  req.QueryExpression  = sQuery
  req.ReturnExpression = sReturn
  req.ReplyNumber      = 1
  req.RequestCount     = 30

  ' 検索を実行
  Dim rs As ShunResultSet = service.Search( req )

  ' 自動コミットを無効に切替え
  service.AutoCommit = False                                            (1)

  Try
    ' 3番目のデータを削除対象に設定
    Dim deleteRecCol As ShunRecordCollection = New ShunRecordCollection()
    deleteRecCol.Add( rs.Records(2) )

    ' データを削除
    service.Delete( deleteRecCol )

    ' 5番目のデータを更新対象に設定
    Dim updateRecCol As ShunRecordCollection = New ShunRecordCollection()
    Dim record As ShunRecord = rs.Records(4)
    record.Data = updateData
    updateRecCol.Add( record )

    ' データを更新
    service.Update( updateRecCol )

    ' コミットの実行
    service.Commit()                                                    (2)

    Catch
      If service.State = ShunConnectionState.Open
    ' ロールバックの実行
        service.Rollback()                                              (3)
      End If
      Throw
    End Try
  
  service.Disconnect()

Catch e As ShunContinuousException
  ' ShunContinuousExceptionが発生した場合の処理を記述
  Try
    If Not service Is Nothing And service.State = ShunConnectionState.Open Then
      service.Disconnect()
    End If
  Catch ex As ShunException
    Console.WriteLine("エラーメッセージ : {0}", ex.Message )
  End Try
  Console.WriteLine("エラーメッセージ : {0}", e.Message )

Catch e As ShunTransactionRolledbackException
  ' ShunTransactionRolledbackExceptionが発生した場合の処理を記述
  Try
    If Not service Is Nothing And service.State = ShunConnectionState.Open Then
      service.Disconnect()
    End If
  Catch ex As ShunException
    Console.WriteLine("エラーメッセージ : {0}", ex.Message )
  End Try
  Console.WriteLine("エラーメッセージ : {0}", e.Message )

Catch e As ShunConnectionTerminatedException
  ' ShunConnectionTerminatedExceptionが発生した場合の処理を記述
  Console.WriteLine("エラーメッセージ : {0}", e.Message )

End Try

■(1)自動コミットを無効に切替え

ShunServiceクラスのAutoCommitプロパティで、自動コミットを無効に切り替えます。

ShunServiceオブジェクト作成時は、自動コミットが有効になっていますので、切替えが必要です。
再度自動コミットを有効にしたい場合は、AutoCommitプロパティにtrueを設定します。

■(2)コミットの実行

トランザクションを終了し、それまでの操作をShunsakuに反映したい場合は、Commitメソッドを実行します。

■(3)ロールバックの実行

エラーが発生したときなど、それまでの操作をShunsakuに反映しないでトランザクションをロールバックする場合は、Rollbackメソッドを実行します。

.NET APIの詳細については、“.NET APIリファレンス”を参照してください。

下へ5.3.1 エラー発生時の対処

目次 索引 前ページ次ページ

All Rights Reserved, Copyright(C) 富士通株式会社 2006