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:
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!!
Que fait la méthode 'addCode'? –
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. –
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. –