Visual Basic で COM + トランザクションを使用する方法です。NET コンポーネント

文書翻訳 文書翻訳
文書番号: 315707
すべて展開する | すべて折りたたむ

目次

概要

この資料で COM + (コンポーネントの使用方法を示しています。サービス) トランザクションを Visual Basic にします。NET クラスです。一連のデータベース操作は、1 つの単位としてと見なされます。操作はすべて成功したり、1 つの操作が失敗した、トランザクション全体が失敗します。後者の場合、データベース操作が行われた、基になるに投稿されません。データベースです。

要件

以下に、推奨されるハードウェア、ソフトウェアを説明します。ネットワークのインフラストラクチャ、スキルと知識、および service pack:
  • Microsoft Windows 2000 SP 1 を実行しているサーバー
  • Microsoft インターネット インフォメーション サービス (IIS) version 4.0またはそれ以降
  • Microsoft Internet Explorer 5.0、5.5、または6.0
必要な知識。
  • トランザクションの概念の知識と処理
  • COM + (コンポーネント サービス) に関する知識

COM + のトランザクション サービス

は、 System.EnterpriseServices マイクロソフト内の名前空間。NET フレームワークが用意されています、トランザクション処理を実装するために機能します。COM + にアクセスするのにはトランザクション サービスは、次の手順に従ってクラスを作成します。
  1. Visual Studio を開きます。NET。
  2. PrjEnterprise という名前の新しいクラス ライブラリ プロジェクトを作成します。Visual Basic。NET。Visual Basic。NET は、という名前のパブリック クラスを作成します。Class1。
  3. プロジェクトに参照を追加、System.EnterpriseServices ライブラリです。ソリューション エクスプ ローラー] ウィンドウで、右クリックします。は、 参照 フォルダー、および選択 参照を追加します。 ショートカット メニューの。で、 .NET タブを見つけるまでスクロール System.EnterpriseServices.ダブルクリック System.EnterpriseServices、を確認してください System.EnterpriseServices [コンポーネントの選択] ウィンドウに表示しをクリックして [OK].
  4. 使用して、 インポート ステートメントは、 System.EntpriseServices 名前空間と、 System.Data.SqlClient 名前空間のいずれかを完全に修飾する必要はありませんようにコードの後半でこれらの名前空間への参照。これらのステートメントを表示する必要があります。その他のステートメントの前に、クラス ファイル内。
    	Imports System.EnterpriseServices
    Imports System.Data.SqlClient
  5. COM + トランザクション サービスは、クラスを使用するには名前付き clsES、ServicedComponent から機能を継承する必要がありますと。
    	Public Class clsES
    Inherits ServicedComponent
  6. A トランザクション 属性を使用して、トランザクション サポートのレベルを指定するのにはクラス。
    <Transaction(TransactionOption.Required)> Public Class clsES
       	Inherits ServicedComponent
  7. 呼ばれる clsES 内のメソッドを作成します。 dbAccess 4 つの整数の入力パラメーターを受け取ります。最初の 2 つパラメーターは、プロダクト ID と単位の商品を提供します。は、もう 1 つは 2 つのパラメーターは、製品 ID、および在庫を提供します。製品です。一連のデータベース操作に対してこれらのこのメソッドの実行します。指定した商品 Id をトランザクションとして扱うこと。
    	Public Sub dbAccess (ByVal pid1 As Integer, _
    ByVal onOrder As Integer, _
          ByVal pid2 As Integer, ByVal inStock As Integer)
  8. で、 dbAccess メソッドは、Northwind の SQL 接続オブジェクトを作成します。データベースで、し、[接続] を開きます。使用して、データベース操作をを実行します。このデータベース:
    Dim Conn As New _
      SqlConnection("uid=sa;database=northwind;server=localhost")
    Conn.Open()
  9. 任意のデータベース処理をキャプチャするのには、Try ブロックを設定します。発生する可能性があります。中止することができるためにこれらのエラーをキャッチする必要があります、トランザクション。Try ブロックがあります 2 つのデータベース操作、各テーブルのレコードに指定された製品を別のフィールドを更新します。
    		Try
  10. [商品] テーブルの最初の更新を実行します。更新プログラムは、 手持ち在庫数 指定された ID を持つ製品を onOrder 値フィールド最初の 2 つの入力パラメーターにします。SQLcommand を使用して、この更新プログラムの SQL を実行します。
    	   Dim Cmd As SqlCommand
          Dim sqlString As String = _
               "update products set UnitsonOrder = " & onOrder _
               & " where productId = " & pid1         
          Cmd = New SqlCommand(sqlString, Conn)
          Cmd.ExecuteNonQuery()
  11. [商品] テーブルに別の更新プログラムを実行します。更新プログラムは、 "梱包単位" により、inStock で指定された ID を持つ製品の値を持つフィールド3 番目と 4 番目パラメーターにします。SQLCommand を使用してこれを実行するのにはSQL を更新します。
          sqlString = _
    "update products set UnitsinStock = " _
    & inStock & " where productId = " & pid2
               
          Cmd.CommandText = sqlString
          Cmd.ExecuteNonQuery()
  12. これらの更新プログラムは、COM + トランザクションの一部であるため、1 単位としてコミットされます。は、 setComplete メソッドは、 contextUtil クラスは、 System.EnterpriseServices 名前空間を使用して: この場合、2 つのトランザクションをコミットするには[最新情報]: 場合は、エラーはスローされません。
          ContextUtil.SetComplete()
  13. Northwind データベースへの接続が切断されます。
          Conn.Close()
  14. SQL コマンドの実行中に発生したエラーする必要があります。全体のトランザクションを中止することができますように、キャッチします。
    	   Catch e As Exception
  15. は、 setAbort contextUtil クラスのメソッドは、 System.EnterpriseServices 名前空間を使用すると、トランザクション全体が中断します。場合は、最初更新が成功したし、2 回目の更新が失敗した、どちらの更新が転記されます。[商品] テーブルします。示すを呼び出し元に、キャッチした例外がスローされます。トランザクションが失敗したこと。
          	ContextUtil.SetAbort()
    			Throw e
    		End Try
  16. ために正しく機能するには、このコンポーネントは、コンポーネントは、厳密な名前が必要です。厳密な名前を生成するのには、次の手順を実行します。厳密な名前でアセンブリに署名します。

    1. Visual Studio を表示します。コマンド プロンプトに net で、クリックしてください 開始をクリックして プログラムをクリックして マイクロソフトの Visual Studio。NET、し Visual Studio。NET のツール.
    2. コマンド プロンプトで sn.exe-ksnEnterprise.snk アセンブリに厳密な名前を指定します。

      のアセンブリの厳密な名前の署名の詳細についてを参照してくださいが。NETFramework SDK 参照してください。
    3. SnEnterprise.snk をプロジェクト フォルダーにコピーします。
    4. 使用には、次のコード行を追加します。アセンブリ属性のステートメントの前後に他の。
      <Assembly: AssemblyKeyFileAttribute("..\..\snEnterprise.snk")>
    5. 保存し、プロジェクトをビルドします。

完全なコード リスト

Imports System.Data.SqlClient
Imports System.EnterpriseServices

<Transaction(TransactionOption.Required)> Public Class ClsES
    Inherits ServicedComponent

Public Sub dbAccess(ByVal pid1 As Integer, ByVal onOrder As Integer, _
      ByVal pid2 As Integer, ByVal inStock As Integer)

        Dim Conn As New _
          SqlConnection("uid=sa;database=northwind;server=localhost")
          Conn.Open()
        Try
          Dim Cmd As SqlCommand
          Dim sqlString As String = _
             "update products set UnitsonOrder = " & _
              onOrder & " where productId = " & pid1
          Cmd = New SqlCommand(sqlString, Conn)
          Cmd.ExecuteNonQuery()

          sqlString = _

         " update products set UnitsinStock = " & inStock & _
                " where productId = " & pid2
           Cmd.CommandText = sqlString
           Cmd.ExecuteNonQuery()

           ContextUtil.SetComplete()
           Conn.Close()
        
         Catch e As Exception
            ContextUtil.SetAbort()
		  Throw e
        End Try
    End Sub 
End Class

動作を検証します。

このコードをテストするには、clsES を使用するコンソール アプリケーションを作成します。1 つのケースでは、トランザクションが正常に実行、および onorderにより、instock フィールドは、指定された製品に更新されます。2 番目のケースでは、更新プログラムを onOrder 指定した製品用の更新プログラムが成功するためのフィールド、 により、inStock 製品が失敗した場合は、フィールドのため、指定した製品の数[商品] テーブルには存在しません。これは、結果、トランザクションの障害で、無視されるトランザクションには。
  1. TestES をという名前の新しいコンソール アプリケーションを追加、ソリューションは、testES プロジェクトがソリューションに含まれるようにし、prjEnterprise プロジェクトです。クリックして、新しいプロジェクトを追加するには 新しい で、 ファイル メニューのしを選択 プロジェクト.
  2. A 新しいプロジェクト ダイアログ ボックスが表示されます。プロジェクトの Visual Basic フォルダーを選択します。種類] ペイン、および選択 コンソール アプリケーション テンプレートから。で、 名前 [テンプレート] ペインの [種類] ボックス testES,つまり、プロジェクトの名前です。確認、 ソリューションに追加します。 ダイアログ ボックスの下部に表示されるボタンです。選択します。クリックしてください。 [OK] このプロジェクトをソリューションに追加します。
  3. された [testES clsES をテストするために、追加する必要があります、参照します。ソリューション] ウィンドウ内を右クリックし、 参照 プロジェクト testES] では、追加したフォルダー。選択 参照を追加します。.は、 参照を追加します。 ダイアログ ボックスが表示されます。
  4. 選択、 プロジェクト タブし、ダブルクリック prjEnterprise.参照が表示されます。 選択した構成部品、ダイアログ ボックスの下部にあります。クリックしてください。 [OK] このプロジェクトへの参照を追加します。
  5. コンソール アプリケーションを右クリックし、 testES、し、 スタートアップと設定します。プロジェクト.
  6. で、 デバッグ メニューの選択 Windows.このサブメニューを選択します。 イミディ エイト.これは、イミディ エイト ウィンドウが表示されていることになります。
  7. モジュール Module1 に、次のテスト コードをコピーの交換Main を Sub および End Sub ステートメントで。モジュールは、次のようにする必要があります。
        Sub Main()
            Dim myTest As New prjEnterprise.clsES()
    
            Try
                myTest.dbAccess(1, 777, 2, 888)
                Debug.WriteLine("TRANSACTION ONE -- SUCCESS")
               
                myTest.dbAccess(1, 5, 2, -20)
                Debug.WriteLine("TRANSACTION TWO -- SUCCESS")
            
            Catch
                Debug.WriteLine("TRANSACTION FAILURE")
            End Try
        End Sub
  8. テスト コードを実行する F5 キーを押します。
  9. 手順 7 では、コードでは、dbAccess への最初の呼び出しは成功します。[商品] テーブルには、製品 1 と 2 製品です。は、 onOrder 777 には、製品 1 を更新するためのフィールドとは により、inStock 888 に 2 のフィールドが更新されます。このトランザクション成功した場合は、イミディ エイト ウィンドウ"トランザクションの 1 つのメッセージを表示します。成功"。

    DbAccess への 2 番目の呼び出しは失敗します。したがって、どちらdbAccess の製品内の update ステートメントのテーブルにポストされませんがデータベースです。製品 1 可能性があるありますが、 onOrder 2、5 に更新するフィールドを持つことはできませんが により、inStock フィールドを-20 に設定します。内で定義されている制約のため商品テーブルの定義、 により、inStock 負の数にできません。

    その結果、トランザクション全体障害の結果、dbAccess への呼び出しは失敗します。は、[商品] テーブル、dbAccess への呼び出しの前に同じままになります。は、 キャッチ ステートメントからトランザクション失敗の通知を処理します。dbAccess の「トランザクションに表示されるエラー」メッセージでは、イミディ エイト ウィンドウです。
使用して、Northwind の Products テーブルの内容を調べるSQL Server 企業のマネージャーです。製品 1 を表示すると、 onOrder フィールドが 777 に等しいです。製品 2、 により、instock 888 です。2 番目の呼び出しに dbAccess、したがって、これらのフィールドを別の値で得られる、失敗しました。

トラブルシューティング

  • COM + サービスを使用するプロジェクトを持っているかどうかを確認します。厳密な名前。
  • COM + サービスを使用する任意のクラスから継承する必要があります、見つかったサービス対象のコンポーネント、 System.EnterpriseServices 名前空間です。
  • その前に、デバッグ中に、トランザクション タイムアウト可能性があります。コミットまたは中止します。タイムアウトを回避するには、タイムアウト プロパティで使用する、トランザクションの属性です。次のように、1,200、関連付けられたメソッドを取得タイムアウトする前に、トランザクションを完了するのには (秒):
    <transaction(transactionoption.required, timeout:="1200)"> </transaction(transactionoption.required,>

関連情報

詳細については、以下を参照してください。開発者 (MSDN) Web サイト。
COM + 統合: どのようにします。NET Enterprise Services 使用できますビルド分散アプリケーション
?http://msdn.microsoft.com/en-us/magazine/cc301491.aspx
サービス対象のコンポーネント
http://msdn.microsoft.com/en-us/library/aa289839.aspx

プロパティ

文書番号: 315707 - 最終更新日: 2011年7月25日 - リビジョン: 4.0
キーワード:?
kbhowtomaster kbmt KB315707 KbMtja
機械翻訳の免責
重要: このサポート技術情報 (以下「KB」) は、翻訳者による翻訳の代わりに、マイクロソフト機械翻訳システムによって翻訳されたものです。マイクロソフトは、お客様に、マイクロソフトが提供している全ての KB を日本語でご利用いただけるように、翻訳者による翻訳 KB に加え機械翻訳 KB も提供しています。しかしながら、機械翻訳の品質は翻訳者による翻訳ほど十分ではありません。誤訳や、文法、言葉使い、その他、たとえば日本語を母国語としない方が日本語を話すときに間違えるようなミスを含んでいる可能性があります。マイクロソフトは、機械翻訳の品質、及び KB の内容の誤訳やお客様が KB を利用されたことによって生じた直接または間接的な問題や損害については、いかなる責任も負わないものとします。マイクロソフトは、機械翻訳システムの改善を継続的に行っています。
英語版 KB:315707
Microsoft Knowledge Base の免責: Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。

フィードバック

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com