2010-08-13 5 views
2

J'utilise LINQ to SQL et appeler des procédures stockées pour insérer les nouvelles lignes. Le code ci-dessous illustre-t-il un ensemble approprié d'étapes?Transactions dans LINQ to SQL

  1. Je veux insérer (autres fours) que si les quatre inserts sont passés autrement rollback les quatre inserts.
public bool InsertNewInquiry(Inquiry inq) 
{ 
    using (var transaction = new TransactionScope()) 
    { 
     using (DataContextDataContext dc = conn.GetContext()) 
     { 
      foreach (Officer po in inq.Recipients) 
      { 
       int results1 = (int)dc.**spOffice_Insert**(po.Id,po.Name).ReturnValue; 
      } 
      foreach (Lookups tags in inq.Tags) 
      { 
       int results2 = (int)dc.**spTags_Insert**(po.Id,po.Name).ReturnValue; 
      } 

      foreach (Phone phone in inq.Phone) 
      { 
       int results3 = (int)dc.**spPhone_Insert**(po.Id,po.Name).ReturnValue; 
      } 

      int results4 = (int)dc.spInquiry_Insert(
          inq.Id 
          ,inq.StatusId 
          ,inq.PriorityId 
          ,inq.Subject).ReturnValue;     


      if (results1 != 0 && results2 != 0 && results3 != 0 && results4 != 0) 
      { 
       transaction.Complete(); 
       return true; 
      } 
      return false; 

      /* old code: 
      transaction.Complete();  
      if (results == 0) 
       return false; 
      else 
       return true; */ 
     } 
    } 
} 

J'ai essayé le code ci-dessus, mais il n'insère pas l'insert foreach (Résultats1 ... résultats3)

Toute idée comment je peux faire ce travail comme vous le souhaitez?

Répondre

1

envisager une solution où:

  • modifier la portée de vos résultats
  • si un résultat 0 est une condition pour l'un de vos 3 foreach que vous voulez absolument rollback pour, ne pas incrémenter comme indiqué ci-dessous. Il suffit de vérifier 0, et break sur le foreach.
int res1=0, res2=0, res3=0, res4=0; 
foreach (Officer po in inq.Recipients) 
{ 
    res1 += (int)dc.**spOffice_Insert**(po.Id,po.Name).ReturnValue; 
} 
foreach (Lookups tags in inq.Tags) 
{ 
    res2 += (int)dc.**spTags_Insert**(po.Id,po.Name).ReturnValue; 
} 
foreach (Phone phone in inq.Phone) 
{ 
    res3 += (int)dc.**spPhone_Insert**(po.Id,po.Name).ReturnValue; 
} 
res4 += (int)dc.spInquiry_Insert(inq.Id,inq.StatusId,inq.PriorityId,inq.Subject) 
       .ReturnValue;     

//no results are zero 
if (res1 != 0 && res2 != 0 && res3 != 0 && res4 != 0) 
{ 
    transaction.Complete(); 
    return true; 
} 
return false; 
+0

Cela semble à peu près juste, même si je me demande s'ils veulent faire reculer si * une * 'des numéros ReturnValue' est 0. –

+0

Je pense que si les résultats reviennent 0 vous voulez rollback. – Kelsey

0

Vérifiez this post où TransactionScope et LinqToSQL sont utilisés ensemble

0

TransactionScope est la voie à suivre à mon avis. J'ai eu a similar question considérer les transactions dans Linq To SQL il y a un certain temps. Bien que ce ne soit pas le même problème, les réponses que j'ai reçues devraient vous fournir des informations utiles.

Sur la base de ce que je peux dire de votre code vous n'êtes pas comptable pour les quatre résultats de retour avant d'appeler transaction.Complete();. L'instruction Complete() va valider votre transaction, donc vous voulez vous assurer que tout est correct avant d'appeler cela de la même façon que vous utiliseriez COMMIT dans SQL.

+0

mettre à jour ma question, s'il vous plaît jeter un oeil à elle. –

+1

@Nisar Khan vous devriez mettre à jour votre code avec le code actuel car avec la partie que vous avez ajoutée, je n'ai aucune idée de comment cela fonctionne puisque les valeurs de 'result1',' result2', et 'result3' seraient hors de portée depuis ils sont créés dans le foreach et vous ne compareriez qu'avec le dernier résultat de retour d'enregistrements. À part cela, le code semble devoir être engagé. Avez-vous essayé d'exécuter le profileur SQL pour voir si les instructions sont exécutées? – Kelsey