Использование ASP.NET 3.5, Linq to SQL, SQL Server 2005 на Windows Server 2003. Локальный запуск VS 2008 на XP SP3.
Мы должны иметь возможность заключать в транзакции вставки, обновления и удаления. Когда мы впервые попробовали это, обернув блоки кода с using(var trans = new TransactionScope()) { ...; trans.Complete(); }
, мы получили соответствующее исключение, говорящее нам, что нам нужно включить сетевой доступ для удаленных транзакций. Мы так и сделали , и все стало работать так, как мы ожидали.
Перенесемся в сегодня. В нашем приложении есть малоиспользуемая часть, которая также получила лечение TransactionScope. Хотя транзакции работают должным образом во всех других частях нашей кодовой базы, сегодня мы обнаружили, что этот редко используемый компонент вызывает то же исключение «Доступ к сети», что и раньше:
Доступ к сети для диспетчера распределенных транзакций (MSDTC) отключен. Включите DTC для доступа к сети в конфигурации безопасности для MSDTC с помощью инструмента администрирования служб компонентов. http://img101.imageshack.us/img101/5480/msdtcnetworkaccesserror.jpg
Вот код, вызывающий исключение:
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();
}
}
Если у вас есть какие-либо предложения, они будут оценены. Дайте мне знать, если я могу объяснить что-то еще. Заранее спасибо !!