Добрый день.
Есть следующий код на C#
foreach(string id in guid)
{
dsTask.SelectQuery[0].Filters["ID"].IsEnabled = true;
dsTask.SelectQuery.Parameters["ID"].Value = "{Чего-то там}";
dsTask.Open();
if(!dsTask.IsEOF)
{
dsTask.Edit();
dsTask.DataFields["StatusID"] = "GUID статуса";
dsTask.DataFields["ResultID"] = "GUID результата";
dsTask.Post();
}
}
Цикл из двух итераций. Стабильно на второй итерации на строке dsTask.Edit() вываливается ошибка "Разрушительный сбой". Один раз эта ошибка вывалилась с описанием "Ошибка добавления объекта в Microsoft Script Control. Ошибка добавления модуля 'System\__GeneratedEnumsModule'. Разрушительный сбой". Guid1 и guid2 местами менять пробовал - результат тот же. Создавать ds_Task через GetNewItemByUSI для каждой итерации тоже пробовал - "Разрушительный сбой".
Версия ПО Террасофт: 3.3.2.245.
Нравится
Попробовал изменить код на такой:
string[] guid = new string[] {"{guid1}", "{guid2}"}; string[] workflowItemIDs = new string[] {"{wItem1}", "{wItem2}"}; workflowEngineComObj = Activator.CreateInstance(Type.GetTypeFromProgID("TSWorkflowLibrary.WorkflowEngine")); WorkflowEngine we = new WorkflowEngine(workflowEngineComObj); we.SetConnector(TS3Connector.comObj); TS3Connector.Attributes["WorkflowEngine"] = workflowEngineComObj; for(int i = 0; i < guid.Length; ++i) { dsTask.DisableEvents(); dsTask.SelectQuery[0].Filters["ID"].IsEnabled = true; dsTask.SelectQuery.Parameters["ID"].Value = guid[i]; dsTask.Open(); if(!dsTask.IsEOF) { dsTask.Edit(); dsTask.DataFields["StatusID"] = "GUID статуса"; dsTask.DataFields["ResultID"] = "GUID результата"; dsTask.Post(); we.ProcessWorkflowItem(workflowItemIDs[i]); } }
Теперь код стабильно падает с той же ошибкой на втором вызове WorkflowEngine.ProcessWorkflowItem(). В чем может быть дело?
Как минимум в конце цикла надо добавить
dsTask.Close();
Потому что иначе обе итерации работают над одной записью.
if(!dsTask.IsEOF) { dsTask.Edit(); dsTask.DataFields["StatusID"] = "GUID статуса"; dsTask.DataFields["ResultID"] = "GUID результата"; dsTask.Post(); }
Исправьте на
if(!dsTask.IsEOF) { dsTask.Edit(); dsTask.DataFields["StatusID"] = "GUID статуса"; dsTask.DataFields["ResultID"] = "GUID результата"; dsTask.Post(); dsTask.GotoNext(); }
У Вас получается зацикливание в dsTask.IsEOF, так как набор данных не доходит до конца.
Добавление GotoNext() не поможет - в каждой итерации сначала указывается фильтр по ID, потом открывается датасет, в нем одна запись. Просто датасет надо закрыть в конце итерации, чтобы новый фильтр сработал при последующем открытии датасета.
Спасибо за комментарии, dsTask у меня закрывается, просто код скопировал не до конца. Вот исправленный вариант:
string[] guid = new string[] {"{guid1}", "{guid2}"}; string[] workflowItemIDs = new string[] {"{wItem1}", "{wItem2}"}; workflowEngineComObj = Activator.CreateInstance(Type.GetTypeFromProgID("TSWorkflowLibrary.WorkflowEngine")); WorkflowEngine we = new WorkflowEngine(workflowEngineComObj); we.SetConnector(TS3Connector.comObj); TS3Connector.Attributes["WorkflowEngine"] = workflowEngineComObj; for(int i = 0; i < guid.Length; ++i) { dsTask.DisableEvents(); dsTask.SelectQuery[0].Filters["ID"].IsEnabled = true; dsTask.SelectQuery.Parameters["ID"].Value = guid[i]; dsTask.Open(); if(!dsTask.IsEOF) { dsTask.Edit(); dsTask.DataFields["StatusID"] = "GUID статуса"; dsTask.DataFields["ResultID"] = "GUID результата"; dsTask.Post(); we.ProcessWorkflowItem(workflowItemIDs[i]); } dsTask.Close(); }
"Разрушительный сбой" продолжает наблюдаться.