8.х C# и COMConnector

Тема в разделе "Отчеты и обработки для "1С:Предприятие 8"", создана пользователем shurikvz, 2 окт 2010.

  1. TopicStarter Overlay
    shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Собственно вопроса у меня нет, все решено.

    Столкнулся с тем что при подключении к базе из программы на C#, после того как программа отработала, COM-соединение не освобождается (висит в списке пользователей). При новом запуске, создается еще одно подключение, потом еще одно и т.д. Собственно как минимум - это некрасиво :D , поэтому с часик помучался. Если кому в будущем поможет, вот готовый пример на C# (обратите внимание, пришлось освобождать все полученные во время работы объекты, иначе закрыватся не хотело).
    Код:
    [ComVisible(true)]
    class Program
    {
    [MTAThread]
    static void Main(string[] args)
    {
    string connectionString = "File=...; Pwd=...; Usr=...";
    Type oType = Type.GetTypeFromProgID("V82.COMConnector");
    if (oType != null)
    {
    //Создаем COMConnector, соединяемся с базой
    object V8 = Activator.CreateInstance(oType);
    object connection;
    try
    {
    connection = oType.InvokeMember("Connect", BindingFlags.Public | BindingFlags.InvokeMethod, null, V8, new object[] { connectionString });
    }
    catch (Exception e)
    {
    Marshal.ReleaseComObject(V8);
    Console.WriteLine(e.Message);
    Console.WriteLine(e.InnerException.ToString());
    return;
    }
    
    //Создаем и выполняем запрос (получение списка документов в заданном интервале)
    object query = oType.InvokeMember("NewObject", BindingFlags.Public | BindingFlags.InvokeMethod, null, connection, new object[] { "Query" });
    oType.InvokeMember("Текст", BindingFlags.Public | BindingFlags.SetProperty, null, query, new object[] { "ВЫБРАТЬ РеализацияТоваровУслуг.Дата, РеализацияТоваровУслуг.Номер, РеализацияТоваровУслуг.СуммаДокумента ИЗ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг ГДЕ РеализацияТоваровУслуг.Дата МЕЖДУ НАЧАЛОПЕРИОДА(&Дата1, ДЕНЬ) И КОНЕЦПЕРИОДА(&Дата2, ДЕНЬ)" });
    oType.InvokeMember("УстановитьПараметр", BindingFlags.Public | BindingFlags.InvokeMethod, null, query, new object[] { "Дата1", new DateTime(2010, 3, 1, 0, 0, 0) });
    oType.InvokeMember("УстановитьПараметр", BindingFlags.Public | BindingFlags.InvokeMethod, null, query, new object[] { "Дата2", new DateTime(2010, 10, 1, 0, 0, 0) });
    object queryResult = oType.InvokeMember("Выполнить", BindingFlags.Public | BindingFlags.InvokeMethod, null, query, new object[] { });
    object queryResultSelection = oType.InvokeMember("Выбрать", BindingFlags.Public | BindingFlags.InvokeMethod, null, queryResult, new object[] { });
    StringBuilder sb = new StringBuilder();
    while ((bool)oType.InvokeMember("Следующий", BindingFlags.Public | BindingFlags.InvokeMethod, null, queryResultSelection, new object[] { }))
    {
    object field_date = oType.InvokeMember("Дата", BindingFlags.Public | BindingFlags.GetProperty, null, queryResultSelection, new object[] { });
    object field_num = oType.InvokeMember("Номер", BindingFlags.Public | BindingFlags.GetProperty, null, queryResultSelection, new object[] { });
    object field_sum = oType.InvokeMember("СуммаДокумента", BindingFlags.Public | BindingFlags.GetProperty, null, queryResultSelection, new object[] { });
    sb.Length = 0;
    sb.Append("Дата:");
    sb.Append(field_date);
    sb.Append(",\t№ ");
    sb.Append(field_num);
    sb.Append("\t - ");
    sb.Append(field_sum);
    
    Console.WriteLine(sb.ToString());
    }
    
    //Освобождаем память
    Marshal.ReleaseComObject(queryResultSelection);
    Marshal.ReleaseComObject(queryResult);
    Marshal.ReleaseComObject(query);
    Marshal.ReleaseComObject(connection);
    Marshal.ReleaseComObject(V8);
    }
    
    Console.WriteLine("Press any key...");
    Console.ReadKey();
    }
    }
    
    
Похожие темы
  1. sergey484
    Ответов:
    2
    Просмотров:
    3.164
  2. Дядя Вова
    Ответов:
    15
    Просмотров:
    1.445
Загрузка...

Поделиться этой страницей