Ошибка "Разрушительный сбой" при вызове Dataset.Edit()

Добрый день.
Есть следующий код на C#

string[] guid = new string[] {"{guid1}", "{guid2}"};
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.

Нравится

6 комментариев

Попробовал изменить код на такой:

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();
}

"Разрушительный сбой" продолжает наблюдаться.

Riptor, вложите, пожалуйста, сервисы.

Показать все комментарии