Гость
Форумы / [игнор отключен] [закрыт для гостей] / 1С, C# и OLE, типы данных / 4 сообщений из 4, страница 1 из 1
26.07.2010, 09:47
    #36758826
StealthDark
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
1С, C# и OLE, типы данных
Добрый день.

Возникла проблема над которой бьюсь уже далеко не первый день и безрезультатно.
На С# написан некий сервис обращающийся к 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
27.07.2010, 10:18
    #36761006
StealthDark
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
1С, C# и OLE, типы данных
В общем проблему удалось решить, кому надо выкладываю код:
Код: 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
Период между сообщениями больше года.
27.11.2016, 23:40
    #39355601
Андрей GR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
1С, C# и OLE, типы данных
Уважаемые коллеги, никак не могу понять, как подключит данную процедуру, недавно перешел на С#

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

Код: 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
01.12.2016, 10:02
    #39358223
Zerro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
1С, C# и OLE, типы данных
тПользовательБазы = "OLE";
тПарольБазы = "1";
тИмяСервера = "srv";
тИмяБазы = "baza";

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


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

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

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


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