や、Visual C++ 2005 コンポーネントを Visual C++ .NET コンポーネントで COM + トランザクションを使用する方法

文書翻訳 文書翻訳
文書番号: 815814 - 対象製品
すべて展開する | すべて折りたたむ

目次

結果

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

要件

この資料は、次のトピックについて詳しい知識のあるユーザーを対象としています:
  • トランザクションの概念と処理
  • COM + (コンポーネント サービス)

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

Microsoft .NET Framework で System.EnterpriseServices 名前空間を処理するトランザクションを実装できます。 アクセス COM + トランザクション サービスは、クラスを作成します。 これを行うには、次の手順を実行します。
  1. Visual Studio .NET または Visual Studio 2005 を起動します。
  2. [ ファイル ] メニューの [ 新規作成 ] をポイントし、[ プロジェクト ] をクリックします。
  3. [ プロジェクトの種類 ] で [ Visual C++ プロジェクト ] をクリックし、 クラス ライブラリ (.NET) [ テンプレート ] ボックスの一覧の [。 [プロジェクト名] ボックスに prjEnterprise と入力し、[OK] をクリックします。

    メモ [Visual Studio 2005 で Visual C++ プロジェクトの種類 ] の [を [ テンプレート ] ボックスの一覧の [ クラス ライブラリ をクリックします。
  4. ソリューション エクスプローラーで 参照設定 ] を右クリックし、[ 参照の追加 ] をクリックします。
  5. [ 参照の追加 ] ダイアログ ボックス NET ] タブをクリックします。
  6. System.EnterpriseServices [ コンポーネントの名前 をダブルクリックします。
  7. [ 選択されたコンポーネント ] が表示される System.EnterpriseServices ことを確認し、 [OK] を実行します。
  8. prjEnterprise.h ファイルにほかのステートメントの前に次のコードを追加:
    using namespace System;
    using namespace System::Data;
    using namespace System::Data::SqlTypes;
    using namespace System::Data::Common;
    using namespace System::EnterpriseServices;
    using namespace System::Data::SqlClient;
    
  9. prjEnterprise.h ファイルに clsES という新しいクラスを追加します。
  10. 使用する COM + トランザクション サービス、確認をクラス ( clsES ) 機能クラスから継承 ServicedComponent よう:
    public __gc class clsES:public ServicedComponent
    
  11. クラスのトランザクションのサポートのレベルを次のように指定する トランザクション 属性を使用:
    [Transaction(TransactionOption::Required,Timeout=5)]public __gc class clsES:public ServicedComponent
    
  12. 4 つの整数の入力パラメーターを受け取る clsES クラスでメソッドを作成します。 名前、クラス dbAccess です。 最初の 2 つのパラメータで商品 ID (ProductID) とその商品の受注数 (UnitsOnOrder) を入力します。 次の 2 つのパラメータで商品 ID とその商品の在庫数 (UnitsInStock) を入力します。 このメソッドはトランザクションとして扱われるされるこれらの指定した商品 ID に対するデータベース操作のセットを実行:
    public:	void dbAccess(int pID1, int onOrder, int pID2, int inStock)
  13. dbAccess メソッドで、Northwind の SQL 接続オブジェクトを作成、データベースし、接続を開きます。 次のデータベースを使用してデータベース操作を行う:
    SqlConnection * Conn = new SqlConnection("user id=<username>;password=<password>;Initial Catalog=northwind;Data Source=<Your SQL Server name>;");
    Conn->Open();
    メモ を記憶する、SQL Server サーバーの正しい値を反映するには、接続文字列パラメーターを変更します。
  14. 例外データベース処理中に発生する可能性をキャプチャする ブロックを設定します。 これらの例外をキャッチして、トランザクションを中断する必要があります。 実行してください </a0> ブロックが 2 つのデータベース操作には含まれます。 操作ごとに、指定した商品 (Products) テーブル レコード内の異なるフィールドが更新されます。
    try { 
    
  15. 商品テーブルに対して最初の更新を実行します。 最初の 2 つの入力パラメーターで指定された ID が、製品の onOrder 値で、 [発注済] フィールドを更新します。 この SQL 更新プログラムを実行する、次の SQL コマンドを使用:
    SqlCommand * sqlCommand = new SqlCommand("UPDATE Products SET UnitsonOrder = @onOrderString WHERE productID = @pID1String ", Conn);
    sqlCommand->Parameters->Add(new SqlParameter("@onOrderString",SqlDbType::VarChar ,
    	40,ParameterDirection::Input,true,0,0,"Description",DataRowVersion::Current,onOrder.ToString()));
    sqlCommand->Parameters->Add(new SqlParameter("@pID1String", SqlDbType::VarChar,
    	40,ParameterDirection::Input,true,0,0,"Description",DataRowVersion::Current,pID1.ToString()));
    sqlCommand->ExecuteNonQuery();
    
  16. 商品テーブルに対してもう一度更新を実行します。 在庫 フィールドを更新、 inStock ID、3 番目と 4 番目の入力パラメーターで指定されている製品の値。 この SQL 更新プログラムを実行する、次の SQL コマンドを使用:
    sqlCommand->Parameters->Add(new SqlParameter("@inStockString",SqlDbType::VarChar ,
    	40,ParameterDirection::Input,true,0,0,"Description",DataRowVersion::Current,inStock.ToString()));
    sqlCommand->Parameters->Add(new SqlParameter("@pID2String", SqlDbType::VarChar,
    	40,ParameterDirection::Input,true,0,0,"Description",DataRowVersion::Current,pID2.ToString()));
    sqlCommand->ExecuteNonQuery();
    
  17. これらの更新は COM+ トランザクションの一部であるため、1 つの単位としてコミットされます。 System.EnterpriseServices 名前空間から、 contextUtil クラスの setComplete メソッドを使用してトランザクションをコミットする (この場合は、2 つ更新) エラーがスローされなかった場合:
    ContextUtil::SetComplete(); 
    
  18. 次のコードを Northwind データベースへの接続を閉じる使用:
    Conn->Close(); }
    
  19. トランザクション全体を中止できるように、SQL コマンドの実行中に発生する例外をキャッチする必要があります:
    catch(Exception * e){ 
    
  20. トランザクション全体を中止するには、 System.EnterpriseServices 名前空間から、 contextUtil クラスの setAbort メソッドを使用します。 最初の更新が成功し、2 回目の更新が失敗すると、どちらの更新も商品テーブルにポストされません。 呼び出し元に、トランザクションが失敗したことを示す、キャッチされた例外はスロー:
    ContextUtil::SetAbort();
    throw e; }
    
  21. このコンポーネントが適切に機能するには、コンポーネントに厳密な名前を付ける必要があります。 厳密な名前を作成し、厳密な名前を使用してアセンブリを署名します。 これを行うには、次の手順を実行します。
    1. Visual Studio .NET コマンド プロンプトでは、 sn.exe-k snEnterprise.snk キー ファイルを作成するを入力します。 厳密な名前を使用してアセンブリを署名する方法の詳細については、.NET Framework SDK ドキュメントを参照してください。
    2. snEnterprise.snk をプロジェクト フォルダにコピーします。
    3. AssemblyInfo.vc 中に、コードの次の行をほかアセンブリ属性のステートメントの前後に追加:
      [assembly:AssemblyKeyFileAttribute("..\\snEnterprise.snk")]; 
    4. プロジェクトを保存してビルドします。

完全なコード リスト

メモ Remember to change your connection string parameters to reflect the correct values for your SQL Server server.
#pragma once

using namespace System;
using namespace System::Data;
using namespace System::Data::SqlTypes;
using namespace System::Data::Common;
using namespace System::EnterpriseServices;
using namespace System::Data::SqlClient;

namespace prjEnterprise
{
	
	[Transaction(TransactionOption::Required,Timeout=5)]
	public __gc class clsES:public ServicedComponent
	{
	public:	SqlConnection * Conn;

	public:	void dbAccess(int pID1, int onOrder, int pID2, int inStock)
		{
			try
			{			
				SqlConnection * Conn = new SqlConnection("user id=<username>;password=<password>;Initial Catalog=northwind;Data Source=<Your SQL Server name>;");
				Conn->Open();
				
				SqlCommand * sqlCommand = new SqlCommand("UPDATE Products SET UnitsonOrder = @onOrderString WHERE productID = @pID1String ", Conn);
				sqlCommand->Parameters->Add(new SqlParameter("@onOrderString",SqlDbType::VarChar ,
					40,ParameterDirection::Input,true,0,0,"Description",DataRowVersion::Current,onOrder.ToString()));
				sqlCommand->Parameters->Add(new SqlParameter("@pID1String", SqlDbType::VarChar,
					40,ParameterDirection::Input,true,0,0,"Description",DataRowVersion::Current,pID1.ToString()));
				sqlCommand->ExecuteNonQuery();
				
				sqlCommand->CommandText = "UPDATE Products SET UnitsinStock = @inStockString WHERE productID = @pID2String" ;
				sqlCommand->Parameters->Add(new SqlParameter("@inStockString",SqlDbType::VarChar ,
					40,ParameterDirection::Input,true,0,0,"Description",DataRowVersion::Current,inStock.ToString()));
				sqlCommand->Parameters->Add(new SqlParameter("@pID2String", SqlDbType::VarChar,
					40,ParameterDirection::Input,true,0,0,"Description",DataRowVersion::Current,pID2.ToString()));
				sqlCommand->ExecuteNonQuery();

				ContextUtil::SetComplete();
				Conn->Close();
			}
			catch(Exception * e)
			{
				ContextUtil::SetAbort();
			
				throw e;
			}			
		}
	};


}
メモ 共通言語ランタイムを追加する必要がありますコンパイラ オプションをサポート (または clr:oldSyntax) を正常に上記のコード サンプルをコンパイルする Visual C++ 2005 で。 追加する、共通言語ランタイム サポート コンパイラ オプション Visual C++ 2005 には、次の手順に従います。
  1. プロジェクト ] をクリックして [<ProjectName> プロパティ

    メモ <ProjectName> は、プロジェクトの名前のプレースホルダーです。
  2. [構成プロパティ ] を展開し、[ 全般 しています。
  3. [印刷] をクリック 共通言語ランタイム サポート、古い構文 (または clr:oldSyntax) 共通言語ランタイム サポート のプロジェクト設定右側のウィンドウで [で [ 適用 ] をクリックを [OK] をクリックします。
共通言語ランタイムの詳細についてサポート コンパイラ オプションは、次のマイクロソフト Web サイトを参照してください。
/clr (共通言語ランタイムのコンパイル)
http://msdn2.microsoft.com/en-us/library/k8d11d4s.aspx

動作の検証

このコードをテストするには、 clsES クラスを使用するコンソール アプリケーション プロジェクトを作成します。 1 の場合は、トランザクションが成功したされ、 [発注済] 在庫 のフィールドを指定された製品が更新されます。 後者の場合、指定した商品の [発注済] フィールドの更新プログラムが成功したが、製品の 在庫 フィールドの更新が指定された製品番号が [商品] テーブルに存在しないために失敗しました。 これにより、トランザクションの障害され、トランザクションは無視されます。
  1. 開始 Visual Studio .NET または Visual Studio 2005 します。
  2. [ ファイル ] メニューの [ 新規作成 ] をポイントし、[ プロジェクト ] をクリックします。
  3. [ プロジェクトの種類 ] で [ Visual C++ プロジェクト ] をクリックし、 コンソール アプリケーション (.NET) [ テンプレート ] ボックスの一覧の [。

    メモ [Visual Studio 2005 で Visual C++ プロジェクトの種類 ] の [を [ テンプレート ] ボックスの一覧の [ CLR コンソール アプリケーション をクリックします。
  4. [ 名前 ] ボックスに、 testES を入力します。 ソリューションに追加 のオプション </a0>] が選択されていることを確認します。
  5. このプロジェクトをソリューションに追加する [OK] をクリックします。
  6. prjEnterprise をテストする testES の参照を追加する必要があります。 ソリューション エクスプローラーで testES だけ追加) される、[ 参照設定 を右クリックし、[ 参照の追加 ] をクリックします。
  7. [ 参照の追加 ] ダイアログ ボックスが表示されます。 [ プロジェクト ] タブには prjEnterprise をダブルクリックします。
  8. 下の参照が表示されます 選択したコンポーネントの 。 このプロジェクトへの参照を追加する [OK] をクリックします。
  9. System.EnterpriseServices 名前空間をプロジェクトに参照を追加します。 ソリューション エクスプローラーで 参照設定 ] を右クリックし、[ 参照の追加 ] をクリックします。
  10. [ 参照の追加 ] ダイアログ ボックスが表示されます。 コンポーネント名 を [ .NET ] タブで、[ System.EnterpriseServices をダブルクリックします。
  11. [ 選択したコンポーネント System.EnterpriseServices が表示されている確認します。 [OK]
  12. testES ] を右クリックし、[ スタートアップ プロジェクトに設定 しています。
  13. testES クラスの _tmain() 関数で、次のソース コードを貼り付けます:
    prjEnterprise::clsES * myTest = new prjEnterprise::clsES();	
    try 
    {
    	myTest->dbAccess(1, 777, 2, 888);
    	Console::WriteLine("TRANSACTION ONE -- SUCCESS");
    
    		myTest->dbAccess(1, 5, 2, -20);
    	Console::WriteLine("TRANSACTION TWO -- SUCCESS");
    }
    catch (Exception * e)
    {
    	Console::WriteLine("TRANSACTION FAILURE");
    	//Console::WriteLine("Error Message: {0}",e->Message);	 
    	//uncomment this line if you must get detailed error information
    }
    
  14. F5 キーを押してプログラムをテストします。

    手順 7 で、コード dbAccess 最初の呼び出し成功します。 製品 1 と製品 2 は、[商品] テーブルです。 製品 1 の onOrder フィールドが 777 に更新される、 inStock 製品 2 は 888 に更新用のフィールドします。 このトランザクションが成功した、ため、出力ウィンドウに次のメッセージが表示されます。
    トランザクションの 1 つの成功
    2 番目の呼び出し dbAccess には失敗します。 そのため、 dbAccess の商品] テーブルにでも更新ステートメントはデータベースにポストします。 製品 1 は、 [発注済] フィールドが 5 に更新が、製品 2 はその 在庫 ] フィールドが -20 に設定ことはできません。 商品テーブルの定義で定義されている制約の 在庫 が負の数値を使用できません。 したがって、この dbAccess の呼び出し失敗し、トランザクション全体が失敗します。 dbAccess の呼び出し前に、の [商品] テーブルのままです。 catch ステートメント dbAccess からトランザクション失敗の通知を処理するあり、次のエラー メッセージ、出力ウィンドウにメッセージします。
    トランザクションの失敗
  15. SQL Server Enterprise Manager を使用して、Northwind 商品テーブルの内容を調べます。 製品 1 を表示すると、 [発注済] フィールドは 777 です。 製品 2 を表示するとき、 在庫 フィールドの値 888 です。 そのため、 dbAccess なくなりれるこれらのフィールドに対し異なる値) を 2 番目の呼び出しが失敗します。

トラブルシューティング

  • COM+ サービスを使用するプロジェクトに厳密な名前が付いていることを確認します。
  • COM+ サービスを使用するクラスは、サービス コンポーネントから継承する必要があります。 サービス コンポーネントは、 System.EnterpriseServices 名前空間にあります。
  • デバッグ時、トランザクションがコミットまたは中断される前に、トランザクションがタイムアウトすることがあります。 タイムアウトを回避するには、トランザクション属性のタイムアウト プロパティを使用します。 関連付けられているメソッドは、タイムアウトになる前に、トランザクションを完了するの 1, 200 秒例を次に示します:
    [Transaction(TransactionOption::Required,Timeout=1200)]
    
  • コードを実行するときによって予期しない例外が表示される場合があります。 これらの例外の詳細を受信する最後の 2 つのステップ 13 行コメントを解除:
    Console::WriteLine("Error Message: {0}",e->Message);
    uncomment this line if you must get detailed error information

関連情報

詳細については、次のマイクロソフト開発者向けネットワーク (MSDN) Web サイトを参照してください。
COM + の統合: どの .NET Enterprise Services はヘルプをビルド分散アプリケーション
サービス コンポーネント

プロパティ

文書番号: 815814 - 最終更新日: 2007年11月14日 - リビジョン: 3.2
この資料は以下の製品について記述したものです。
  • Microsoft Visual C++ 2005 Express Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition
キーワード:?
kbhowto kbhowtomaster kbsqlclient kbcomplusqc kbcode kbmt KB815814 KbMtja
機械翻訳の免責
重要: このサポート技術情報 (以下「KB」) は、翻訳者による翻訳の代わりに、マイクロソフト機械翻訳システムによって翻訳されたものです。マイクロソフトは、お客様に、マイクロソフトが提供している全ての KB を日本語でご利用いただけるように、翻訳者による翻訳 KB に加え機械翻訳 KB も提供しています。しかしながら、機械翻訳の品質は翻訳者による翻訳ほど十分ではありません。誤訳や、文法、言葉使い、その他、たとえば日本語を母国語としない方が日本語を話すときに間違えるようなミスを含んでいる可能性があります。マイクロソフトは、機械翻訳の品質、及び KB の内容の誤訳やお客様が KB を利用されたことによって生じた直接または間接的な問題や損害については、いかなる責任も負わないものとします。マイクロソフトは、機械翻訳システムの改善を継続的に行っています。
英語版 KB:815814
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