2010-03-11 11 views
4

Utilisation de ASP.NET 3.5, Linq to SQL, SQL Server 2005 sur Windows Server 2003. Exécution de VS 2008 sur XP SP3 localement.TransactionScope fonctionne dans certains endroits et pas dans d'autres

Nous devons être en mesure d'emballer des insertions, des mises à jour et des suppressions dans une transaction. Lorsque nous avons essayé cela en enveloppant des blocs de code avec using(var trans = new TransactionScope()) { ...; trans.Complete(); }, nous avons reçu une exception appropriée nous disant que nous devions activer l'accès réseau pour les transactions à distance. We did so et les choses ont commencé à fonctionner comme prévu.

Avance rapide jusqu'à aujourd'hui. Il y a une partie peu utilisée de notre application qui a également reçu un traitement TransactionScope. Bien que les transactions fonctionnent correctement dans toutes les autres parties de notre base de code, nous avons découvert aujourd'hui que cette pièce rarement utilisée est de lancer la même exception « Network Access » comme avant:

Network access for Distributed Transaction Manager (MSDTC) has been disabled. Please enable DTC for network access in the security configuration for MSDTC using the Component Services Administrative tool. http://img101.imageshack.us/img101/5480/msdtcnetworkaccesserror.jpg

Voici le code qui fait l'exception:

 using (TransactionScope trans = new TransactionScope(TransactionScopeOption.Required, TimeSpan.MaxValue)) 
     { 
      using (var dc = new ChargeXferDataContext()) 
      { 
       //create 'Line' object and set initial values 
       Line line = new Line(); 
       line.Unit_Num = UnitId; 
       line.SubmittedBy = Viewer.Alias(); 
       line.LineSubmittedOn = DateTime.Now; 

       //get codes to move from checked rows 
       //iterate rows in current gridview 
       foreach (GridViewRow row in gv.Rows) 
       { 
        //if checked, insert move order 
        HtmlInputCheckBox cb = (HtmlInputCheckBox)row.FindControl("RowLevelCheckBox"); 
        if (cb.Checked) 
        { 

         //1st: get required values 
         int id = Convert.ToInt32(((TextBox)row.FindControl("fldCodeId")).Text); 
         int newId = Convert.ToInt32(((DropDownList)row.FindControl("ddlNewId")).SelectedValue); 
         char newPOA = Convert.ToChar(((DropDownList)row.FindControl("ddlPOA")).SelectedValue); 

         //2nd: get current diag code from old patient 
         //######## Exception happens here... 
         DiagCode code = dc.DiagCodes.SingleOrDefault(c => c.Id == id); 
         //######## 

         //3rd: add code to emenline object 
         addCode(line, code, newId, newPOA); 

        } 
       } 
       dc.SubmitChanges(); 
       trans.Complete(); 
      } 
     }      

Si vous avez des suggestions, elles seraient appréciées. Faites-moi savoir si je peux expliquer quelque chose de plus. Merci d'avance!!

+0

Que fait la méthode 'addCode'? –

+0

Il ajoute du code, newId et newPOA à l'objet ligne. Il ne le fait jamais à addCode() à cause du linq select dans la ligne ci-dessus. –

+0

Saisir des pailles, mais y a-t-il quelque chose d'inhabituel dans DiagCodes? Lien vers une autre base de données? Proc stocké qui fait quelque chose de drôle? Triggers? En outre, j'aime le modèle d'utilisation d'une fabrique pour générer des DataContexts, donc ils sont tous créés à partir d'un endroit dans l'application. En général, cependant, j'ai trouvé TransactionScope trop floconneuse. La prochaine fois que j'ai besoin d'une transcation ambiante (bientôt disponible dans mon application actuelle), je vais l'implémenter moi-même. Aucune dépendance MSDTC imprévisible, plus il devra supporter Oracle ainsi que SQL Server. –

Répondre

1

Je n'ai jamais trouvé de solution à cela. Déplacé avec la vie.

-1

L'erreur indique tout. Activez le coordinateur de transactions distribuées pour l'accès réseau sur votre serveur de base de données.

+0

Comme indiqué, cela a été fait et les transactions fonctionnent bien dans d'autres parties du code. –

+0

@Bonon Sommardahl, vous dites que cela fonctionne dans d'autres parties du code? Est-ce que cela fonctionne avec ce linq2sql datacontext dans ces endroits? Comment se fait-il que vous n'utilisiez pas une chaîne de connexion lors de la création du datacontext? Êtes-vous sûr que votre fichier de paramètres contient la bonne chaîne de connexion et que le DTC est activé sur cette machine? Votre serveur de base de données dispose-t-il d'un pare-feu et avez-vous essayé de l'éteindre? –

+0

Un DataContext pour tous les gérer. Une chaîne de connexion dans le fichier web.config pour l'application entière. Le même DataContext fonctionne partout ailleurs dans le code. Le problème n'est pas la base de données (c'était au début, mais maintenant c'est corrigé). –

Questions connexes