powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / [игнор отключен] [закрыт для гостей] / 1С, C# и OLE, типы данных
4 сообщений из 4, страница 1 из 1
1С, C# и OLE, типы данных
    #36758826
StealthDark
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

Возникла проблема над которой бьюсь уже далеко не первый день и безрезультатно.
На С# написан некий сервис обращающийся к 1С (версия 8.1), по сути сервис отправляет SQL-запрос 1С-у и получает результат, проблема заключается в определении типов данных полученных в ходе выполнения запроса.

Вот код функции отвечающей за это:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
        private static string oleQueryExecute(string tableName, string sQuery)
        {
            string rowString = "";

            object query = adapter.InvokeMethod(v8, "NewObject", new object[] { "Query", sQuery });
            object queryExec = adapter.InvokeMethod(query, "Execute");
            object queryCols = adapter.GetProperty(queryExec, "Columns");
            int queryColsCount = (int)adapter.InvokeMethod(queryCols, "Count");

            string[] colsNames = new string[queryColsCount];
            for (int i =  0 ; i < queryColsCount; i++)
            {
                colsNames[i] = (string)adapter.GetProperty(adapter.InvokeMethod(queryCols, "Get", new object[] { i }), "Name");
            }

            object queryRes = adapter.InvokeMethod(queryExec, "Choose");
            if ((bool)adapter.InvokeMethod(queryRes, "Next"))
            {
                DataTable DT = new DataTable(tableName);
                for (int i =  0 ; i < queryColsCount; i++)
                    DT.Columns.Add(colsNames[i], adapter.InvokeMethod(queryRes, "Get", new object[] { i }).GetType());

                do
                {
                    DataRow DR = DT.NewRow();
                    for (int i =  0 ; i < queryColsCount; i++)
                    {
                        object val = adapter.InvokeMethod(queryRes, "Get", new object[] { i });
                        if (val.GetType() != DBNull.Value.GetType())
                            DR[i] = val.ToString().Trim();
                    }
                    DT.Rows.Add(DR);

                } while ((bool)adapter.InvokeMethod(queryRes, "Next"));

                DS.Tables.Add(DT);
            }
            return rowString;
        }

На данный момент определение типов данных базируется на данных первой строки
Код: plaintext
1.
2.
                for (int i =  0 ; i < queryColsCount; i++)
                    DT.Columns.Add(colsNames[i], adapter.InvokeMethod(queryRes, "Get", new object[] { i }).GetType());

Но это неправильно, т.к. например могут быть случаи возврата null-значения, или вообще отсутствия строки, но при этом типы данных определить необходимо.
Варианты с заменой null значений, или варианты добавления обязательной первой строки для определения типов данных не рассматриваются, также как и вариант прямого доступа к БД, т.к. 1С файловая.

Как-то так получается тип данных "Тип", но что с ним дальше делать непонятно, сам результат имеет тип "System.__ComObject"
Код: plaintext
1.
adapter.InvokeMethod(adapter.InvokeMethod(adapter.GetProperty(adapter.InvokeMethod(queryCols, "Get", new object[] { i }), "ValueType"),"Types"),"Get",new object[]{ 0 })

Вот и спрашивается, что делать?
...
Рейтинг: 0 / 0
1С, C# и OLE, типы данных
    #36761006
StealthDark
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В общем проблему удалось решить, кому надо выкладываю код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
        private static DataSet DS;

        private static void oleQueryExecute(Adapter adapter, string tableName, string sQuery)
        {
            object v8 = adapter.Connect();
            object query = adapter.InvokeMethod(v8, "NewObject", new object[] { "Query", sQuery });
            object queryExec = adapter.InvokeMethod(query, "Execute");
            object queryCols = adapter.GetProperty(queryExec, "Columns");
            int queryColsCount = (int)adapter.InvokeMethod(queryCols, "Count");

            Type[] colTypes = new Type[queryColsCount];
            string[] colsNames = new string[queryColsCount];
            DataTable DT = new DataTable(tableName);

            for (int i =  0 ; i < queryColsCount; i++)
            {
                object queryCol = adapter.InvokeMethod(queryCols, "Get", new object[] { i });
                colsNames[i] = (string)adapter.GetProperty(queryCol, "Name");
                int typeCount = (int)adapter.InvokeMethod(adapter.InvokeMethod(adapter.GetProperty(queryCol, "ValueType"), "Types"), "Count");
                string typeName = null;

                for (int j =  0 ; j < typeCount; j++)
                    if ((string)adapter.InvokeMethod(v8, "String", new object[] { adapter.InvokeMethod(adapter.InvokeMethod(adapter.GetProperty(queryCol, "ValueType"), "Types"), "Get", new object[] { j }) }) != "Null")
                        typeName = (string)adapter.InvokeMethod(v8, "String", new object[] { adapter.InvokeMethod(adapter.InvokeMethod(adapter.GetProperty(queryCol, "ValueType"), "Types"), "Get", new object[] { j }) });

                switch (typeName)
                {
                    case "Строка":
                        colTypes[i] = typeof(String);
                        break;
                    case "Булево":
                        colTypes[i] = typeof(Boolean);
                        break;
                    case "Дата":
                        colTypes[i] = typeof(DateTime);
                        break;
                    case "Число":
                        colTypes[i] = typeof(Double);
                        break;
                    default:
                        colTypes[i] = null;
                        break;
                }
                DT.Columns.Add(colsNames[i], colTypes[i] == null ? typeof(String) : colTypes[i]);
            }

            object queryRes = adapter.InvokeMethod(queryExec, "Choose");
            while ((bool)adapter.InvokeMethod(queryRes, "Next"))
            {
                DataRow DR = DT.NewRow();
                for (int i =  0 ; i < queryColsCount; i++)
                {
                    object val = adapter.InvokeMethod(queryRes, "Get", new object[] { i });
                    if (val.GetType() != DBNull.Value.GetType())
                        DR[i] = colTypes[i] == null ? val.ToString() : val;
                }
                DT.Rows.Add(DR);
            }
            DS.Tables.Add(DT);
        }
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
1С, C# и OLE, типы данных
    #39355601
Андрей GR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемые коллеги, никак не могу понять, как подключит данную процедуру, недавно перешел на С#

Изменил код вот-так:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
 public static void oleQueryExecute(string StrConnect,  string tableName, string sQuery)
        {
            V83.COMConnector v8 = new V83.COMConnector();
            dynamic adapter; // Через него обращения делать
           

            
            v8.PoolCapacity = 10;
            v8.PoolTimeout = 60;
            v8.MaxConnections = 2;
        

            adapter = v8.Connect(StrConnect);
...
Рейтинг: 0 / 0
1С, C# и OLE, типы данных
    #39358223
Zerro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тПользовательБазы = "OLE";
тПарольБазы = "1";
тИмяСервера = "srv";
тИмяБазы = "baza";

Сом = Новый COMОбъект("V82.COMConnector");


Соединение = Сом.Connect("Srvr=""" +тИмяСервера + """;Ref=""" +тИмяБазы + """;Usr=""" +тПользовательБазы + """;pwd=""" +nПарольБазы+ """;") ;

Возврат Соединение;

так же как и в 1с
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / [игнор отключен] [закрыт для гостей] / 1С, C# и OLE, типы данных
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]