2010-01-21 9 views
1

J'ai une petite application de transaction distribuée de validation de principe qui effectue une insertion simple dans deux tables - une table MS SQL Server, l'autre une table Informix Dynamic Server. Le problème vient quand une exception est levée. Si j'utilise le pilote OLE DB pour Informix, tout fonctionne correctement - les deux insertions sont annulées; Si j'utilise le fournisseur de données .NET pour Informix, l'insertion Informix ne recule pas.Informix .NET Provider et TransactionScope ne reculent pas

Quelqu'un a-t-il une idée de ce qui se passe?

Dans l'extrait de code, vous remarquerez la méthode EnlistTransaction() commentée. En cas d'appel explicite, j'obtiens une exception indiquant que la méthode n'est pas implémentée.

extrait de code:

private void doTransaction(Boolean commitIndicator) 
{ 
    using (TransactionScope tscope = new TransactionScope()) 
    { 
     using (SqlConnection cn = new SqlConnection { ConnectionString = sql2008Settings.ConnectionString }) 
     { 
      cn.Open(); 

      using (SqlCommand cmd = cn.CreateCommand()) 
      { 
       cmd.CommandText = "insert into uom (uom) values ('Test')"; 
       int count = cmd.ExecuteNonQuery(); 
      } 
     } 
     using (IfxConnection cn = new IfxConnection()) 
     { 
      cn.ConnectionString = idnSettings.ConnectionString; 
      cn.Open(); 
      //cn.EnlistTransaction(Transaction.Current); 
      using (IfxCommand cmd = cn.CreateCommand()) 
      { 
       cmd.CommandText = "insert into table_ (code_, description) values ('JEP', 'Test')"; 
       int count = cmd.ExecuteNonQuery(); 
      } 
     } 
     if (commitIndicator) 
     { 
     } 
     else 
     { 
      throw new Exception("planned failure"); 
     } 
     tscope.Complete(); 
    } 
} 

chaînes de connexion:

Répondre

1

Je suis assez sûr que le fournisseur .Net Informix ADO ne prend pas en charge TransactionScope. Ce n'est pas une exigence d'un fournisseur ADO.Net.

Vous pouvez obtenir cela au travail en utilisant COM + et MSDTC, puisque Informix prend en charge cela. Vous devrez effectuer les opérations suivantes:

  • Ajouter "enrôlent = true" à votre chaîne de connexion
  • Ajouter EnterpriseServicesInteropOption.Full à votre constructeur TransactionScope
+0

Excellent !! Changer mon constructeur de TransactionScope a fait l'affaire sans autre changement nécessaire. Je vous remercie. J'ai déjà eu enlist = true dans ma chaîne de connexion mais je pense que j'ai foiré quelque chose en postant mon XML. –