C#
Deserialize
Serialize
Технические вопросы
Разработка

Сохранение сервисов в базу на C#

Здравствуйте! Помогите пожалуйста решить задачу программной загрузки сервисов из файлов на диске в базу, на C#.
Выполняю следующий метод

//connector - соединение с базой, path - путь к сервису wnd_ContactEdit
private static void LoadAndSaveService(Connector connector, string path)
{
 
   var service = (TSObjectLibrary.IService)connector.Services.GetNewItemByUSI("wnd_ContactEdit");

   var xmlStrogare = new TSObjectLibrary.XMLStorage();
   xmlStrogare.LoadFromFile(path);
   service.Deserialize(xmlStrogare.RootNode);
   connector.Services.SaveItem(service, SaveDatabaseObjectActionEnum.sdoaSave);
}

И возникает ошибка в строчке service.Deserialize(xmlStrogare.RootNode):
Object doesn't support interface {76218379-EDB8-43D5-A106-93A32C30612A} ({76218379-EDB8-43D5-A106-93A32C30612A})
Причем при выполнении того же кода в JavaScript в администраторе все нормально десериализуется и сервис сохраняется.
Версия бинарников 3.3.2.194

Нравится

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

Алексей, можете пожалуйста показать код JScript в Администраторе

Метод сериализации в VisualStudio у меня тоже не работал.(Такая же ошибка Object doesn't support interface)

Рабочий код в администраторе Terrasoft, но он заменяет окно редактирования на пустое окно с заголовком

function Main() {
var service = Connector.Services.GetNewItemByUSI("wnd_ContactEdit");
var XMLStorage = new ActiveXObject('TSObjectLibrary.XMLStorage');
XMLStorage.InitRootNode("Service");
XMLStorage.RootNode.SetAttributeAsStr("WindowCaption", "Заголовок окна", "");
service.Deserialize(XMLStorage.RootNode);
Connector.Services.SaveItem(service, 1);
}

Попытка загрузить тем же способом сервис, выгруженный вручную с помощью "Сохранить в файл" из администратора (приложенный во вложении), не привел к успеху.

function Main() {
var service = Connector.Services.GetNewItemByUSI("wnd_ContactEdit");
var XMLStorage = new ActiveXObject('TSObjectLibrary.XMLStorage');
XMLStorage.LoadFromFile("C:\\wnd_ContactEdit.xml");
service.Deserialize(XMLStorage.RootNode);
Connector.Services.SaveItem(service, 1);
}

На строчке service.Deserialize(XMLStorage.RootNode); выскочила ошибка
TSDskWindowLibrary.DskWindow: Член группы не найден

Здравствуйте Алексей
Воспроизвели данную проблему, передали вопрос в отдел разработки. Я вас проинформирую про решение данного вопроса

Здравствуйте всем
Проблема возникает из-за того, что Вы не корректно объявляете переменные.
Ниже приведен абсолютно работоспособный код:

[csharp]
public bool SaveServiceToDatabase(Connector connector, string serviceFilePath)
{
XMLStorage xmlStorage = new XMLStorageClass();
xmlStorage.LoadFromFile(serviceFilePath);
string serviceTypeCode;
string serviceUSI;
try
{
serviceTypeCode = xmlStorage.RootNode.GetAttributeAsStr("ServiceTypeCode", "");
serviceUSI = xmlStorage.RootNode.GetAttributeAsStr("USI", "");
}
catch
{
return false;
}
ServiceInfo serviceInfo =
(TSObjectLibrary.ServiceInfo)сonnector.Services.get_InformationsByUSI(serviceUSI);
if (serviceInfo != null)
{
connector.Services.DeleteItem(serviceUSI, SaveDatabaseObjectActionEnum.sdoaSave);
}
Service service = (TSObjectLibrary.Service)connector.Services.CreateItem(serviceTypeCode);
service.Deserialize(xmlStorage.RootNode);
connector.Services.SaveItem(service, SaveDatabaseObjectActionEnum.sdoaSave);
return true;
}
[/csharp]

Также, при работе с загрузкой сервисов следует учесть, что если сервис уже существует, то при Deserialize (его же xml файл) он начнет выдавать ошибки типа "Component named btnOk already exist". Таким образом, в приведенном выше коде делается проверка на существование сервиса и последующего его удаления.

Большое спасибо за помощь!
Код действительно рабочий!

Единственное что хотелось бы добавить, что если мы сохраняем сервис таблицы, то в строчке

connector.Services.DeleteItem(serviceUSI, SaveDatabaseObjectActionEnum.sdoaSave);

происходит удаление таблицы из базы вместе со всеми данными, что недопустимо.
Конкретно у меня, на этой строчке вылетела ошибка связанная с ForeignKey.

Действительно не нужно удалять сервис, нужно создавать новый, в него все десериализировать и сохранить. Вот код:
[csharp]
public bool SaveServiceToDatabase(Connector connector, string serviceFilePath)
{
XMLStorage xmlStorage = new XMLStorageClass();
xmlStorage.LoadFromFile(serviceFilePath);
string serviceTypeCode;
try
{
serviceTypeCode = xmlStorage.RootNode.GetAttributeAsStr("ServiceTypeCode", "");
}
catch
{
return false;
}
Service service = (TSObjectLibrary.Service)connector.Services.CreateItem(serviceTypeCode);
service.Deserialize(xmlStorage.RootNode);
connector.Services.SaveItem(service, SaveDatabaseObjectActionEnum.sdoaSave);
return true;
}
[/csharp]

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