2011-07-11 11 views
1

私はsystem.Transactionsをウェブサービスとデータベースの周りに使用しています。リモートデータベースに接続できない場合、トランザクションはロールバックされません。データはWebサービスのデータベースに挿入されますが、ロールバックする必要があります。私は自分のWebサービスコードを書いています。分散トランザクションコーディネータサービスが実行され、コンポーネントサービスで他のパラメータが設定されます。Webサービスとデータベース間でトランザクションをロールバックできないのはなぜですか?

Webサービスとクライアントの両方が同じマシンにあると言う方が良いでしょう。

using System.Transactions; 

try 
{ 
    using (TransactionScope tscope = new TransactionScope()) 
    { 
     //----- Web service 
     IdentificationSystem.Service Identify = new IdentificationSystem.Service(); 
     Identify.InsertWorkshopInfo(BosWorkshop.WpSvUserName,   BosWorkshop.WpSvPassword,BosWorkshop.WkIcode 
     //------------- 
     //------------------ connect to a remote DB 
     //--------- My Sql Query 
     string sq= "SET XACT_ABORT ON;update tbl_kargah " + 
      "set [email protected] "+ 
      "where [email protected]_kargah "+ 
      "insert into dbo.tbl_WorkshopCodes (co_kargah,Code_ostan,Wpcode) "+ 
      "values(@Co_kargah,@Code_ostan,@WpCode) "+ 
      "insert into LnkWorkerSystem.Bazresi_kar.dbo.tbl_Workshopcodes(Co_Kargah,Code_Ostan,WpCode) "+ 
      "values(@Co_kargah,@Code_ostan,@WpCode) "; 

     //-------- 
     SqlCon = new SqlConnection(@BoBaz.BazConnectionString); 
     SqlCon.Open(); 
     SqlCom = new SqlCommand(sq, SqlCon); 
     SqlCom.Parameters.Add("@co_kargah", SqlDbType.BigInt).Value = BoBaz.BazCodeKargah; 
     SqlCom.Parameters.Add("@Code_ostan", SqlDbType.NVarChar).Value = BoBaz.BazCodeOstan; 
     SqlCom.Parameters.Add("@WpCode", SqlDbType.NChar).Value = BoBaz.WpRealCode; 
     SqlCom.ExecuteNonQuery(); 
     SqlCon.Close(); 

     tscope.Complete(); 
    } 
} 
catch(Exception ex) 
{ 
    string s = ex.Message; 
} 

は、この質問を参照してください。Transaction

+0

そのコードは私に少しscaries ... –

+0

申し訳ありませんが、私は、私はちょうど私のコードからそれをコピーし –

+0

それを投稿していた私はそれを – cjk

答えて

1

編集:

ダイアログをたくさんした後、それはあなたがASMX Webサービスを使用していると思われます。これらは、基本ウェブサービスであり、この使用法をサポートしていません。

このサポートの増加は、特定のモードでWCF などのように指定されています。(すべてではありません)。追加設定が必要です。しかし、個人的には私のアドバイスは:しないでください。分散トランザクションは、ローカルLAN上のSQLのようなものでは十分に扱いにくいです - ウェブサービスをミックスに追加し、通常は問題を尋ねています(私の意見です)。

しかし、一部の人はこれらのちょっとした問題に遭遇します - YMMV。


はここにあなたのエラーです:

catch(Exception ex) 
{ 
    string s = ex.Message; 
} 

あなたのコードは、おそらく間違ってで何を伝えようとですが、あなたは行って、例外を飲み込みました。

私の推測では、分散トランザクション(おそらくWCF呼び出し)の別の要素が失敗し、トランザクション全体が終了したようです。例外はこれをに伝えます。

IMOでは、catchブロックを完全にから削除します。悪いことが起こったら、それらを隠さずに何が起こったのか疑問に思ってください。あなたの既存の(咳)中央エラー処理もちろんのあなたが頻繁にチェックするエラーログにそのエラーを書き込むトップレベルにバブルアップしましょう。

+0

私の問題は次のとおりです。 Webサービス機能はロールバックされません –

+0

@RaymondとあなたはどのWCFバインディングを使用していますか?すべてのトランザクションをサポートしているわけではありません。また、有効にするための追加手順が必要です。http://www.codeproject.com/KB/WCF/WCFTransactions.aspx –

+0

私はWCFを使用しません。私はASMX Webサービスを使用します。 –