AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 15.10.2011, 16:21   #1  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,164 / 1293 (48) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
ADO NET типы. Как задать значение перечисления NET
Пытаюсь реализовать доступ к базе данных через ADO.NET.
Нужно выполнить хранимую процедуру. Использую пространство имен System.Data (точнее, для нужного значения типа команды достаточно .
System.Data). Если убрать проверки и открытие соединения, то псевдокод следующий:
X++:
    new InteropPermission(InteropKind::ClrInterop).assert();
    command = new System.Data.OleDb.OleDbCommand();
    command.set_CommandTimeout(timeOut);
    command.set_CommandText(sqlText);
    command.set_CommandType(...   ?..);
    command.ExecuteNonQuery();
Как задать перечисление System.Data.CommandType.StoredProcedure в методе set_CommandType?
Пробовал System.Data.CommandType.StoredProcedure и System.Data.CommandType::StoredProcedure
Выдает синтаксическую ошибку.
Старый 15.10.2011, 16:33   #2  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
877 / 649 (23) +++++++
Регистрация: 14.10.2004
Есть перечислимый тип System.Data.CommandType

X++:
command.set_CommandType(System.Data.CommandType::Text);
У меня такя конструкция компилируется

Последний раз редактировалось Ace of Database; 15.10.2011 в 16:35.
Старый 15.10.2011, 16:46   #3  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
877 / 649 (23) +++++++
Регистрация: 14.10.2004
Вот такой джоб у меня работает
X++:
static void Job17(Args _args)
{
    System.Data.OleDb.OleDbCommand  command;
    System.Data.CommandType         t;
    ;
    new InteropPermission(InteropKind::ClrInterop).assert();
    command = new System.Data.OleDb.OleDbCommand();
    command.set_CommandTimeout(300);
    command.set_CommandText("select * from t");
    t = command.get_CommandType();
    print t.ToString();
    pause;
    command.set_CommandType(System.Data.CommandType::StoredProcedure);
    t = command.get_CommandType();
    print t.ToString();
    pause;}
Выполнение следующего кода приводит к сообщению "Неправильный тип аргумента функции"
X++:
    info(strfmt("%1", t.ToString()));

Последний раз редактировалось Ace of Database; 15.10.2011 в 16:52.
Старый 15.10.2011, 16:50   #4  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
877 / 649 (23) +++++++
Регистрация: 14.10.2004
А вот если использовать при вызове strfmt промежуточную строковую переменную, то работает
X++:
    System.Data.OleDb.OleDbCommand  command;
    System.Data.CommandType         t;
    str                             s;
    ;
    new InteropPermission(InteropKind::ClrInterop).assert();
    command = new System.Data.OleDb.OleDbCommand();
    command.set_CommandTimeout(300);
    command.set_CommandText("select * from t");
    t = command.get_CommandType();
    s = t.ToString();
    info(strfmt("%1", s));
    command.set_CommandType(System.Data.CommandType::StoredProcedure);
    t = command.get_CommandType();
    s = t.ToString();
    info(strfmt("%1", s));
Старый 15.10.2011, 17:14   #5  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,164 / 1293 (48) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
У меня ругается не на этапе выполнения, а на этапе компиляции на:
Цитата:
command.set_CommandType(System.Data.CommandType::StoredProcedure);
Что у Вас в ветке AOT References? У меня, помимо тех позиций, что есть в DAX4, только System.Data. Может быть нужны еще какие-то ссылки?
ЗЫ: в стандартной DAX4 в этой ветке:
  • Microsoft.Dynamics.EP.Deployment
  • Microsoft.Dynamics.RfidProxy
  • Microsoft.Dynamics.SharePointProxy
  • System
У меня еще есть System.Data. Может быть еще что-то нужно добавить?
PSS: кстати, время от времени у меня ссылка System.Data пропадает из ветки References.
Старый 15.10.2011, 17:19   #6  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
877 / 649 (23) +++++++
Регистрация: 14.10.2004
Узел References приведен на рисунке.
Миниатюры
Нажмите на изображение для увеличения
Название: References.JPG
Просмотров: 548
Размер:	66.2 Кб
ID:	7221  
За это сообщение автора поблагодарили: Raven Melancholic (5).
Старый 15.10.2011, 22:20   #7  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,320 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
В этой теме : проблема использования Excel через clr
значение енума достается через конструкцию:
X++:
fileFormat = ClrInterop::parseClrEnum('Microsoft.Office.Interop.Excel.XlFileFormat', 'xlTextWindows');
Не очень красиво, но подозреваю, что этот способ может быть единственным способом избежать проблемы компиляции. Лишь бы в run-time режиме работал
__________________
Возможно сделать все. Вопрос времени
За это сообщение автора поблагодарили: Raven Melancholic (5).
Старый 16.10.2011, 09:59   #8  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,164 / 1293 (48) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Цитата:
Сообщение от sukhanchik Посмотреть сообщение
Не очень красиво, но подозреваю, что этот способ может быть единственным способом избежать проблемы компиляции. Лишь бы в run-time режиме работал
В run-time тоже работает! Именно через промежуточную переменную.
X++:
    System.Data.CommandType         type;
    ;
    
    type= ClrInterop::parseClrEnum('System.Data.CommandType', 'StoredProcedure');

    command.set_CommandType(type);
Старый 22.04.2015, 17:35   #9  
lvan is offline
lvan
Участник
Аватар для lvan
Лучший по профессии 2014
 
858 / 82 (4) ++++
Регистрация: 15.04.2011
Записей в блоге: 1
тут проблема не в перечислении а в генерике
в ах вроде нет поддержки таких, только через обжегд с ними можно работать

Последний раз редактировалось lvan; 22.04.2015 в 17:42.
За это сообщение автора поблагодарили: Товарищ ♂uatr (0).
Старый 22.04.2015, 21:32   #10  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
.NET Generic
За это сообщение автора поблагодарили: Товарищ ♂uatr (1).
Старый 20.07.2022, 18:05   #11  
DesparioN is offline
DesparioN
Участник
 
86 / 15 (1) ++
Регистрация: 21.10.2014
Если не сложно, можете раскрыть тему более подробно?

X++:
System.Type                                                     enumValue;
System.Reflection.MethodInfo                          methodInfo;


enumValue = System.Type::GetType("DocumentFormat.OpenXml.EnumValue`1");
methodInfo = enumValue.GetMethod("Value");
А что собственно дальше?

В частности мне надо в DocumentFormat.OpenXml.Spreadsheet.Alignment указать значение для горизонтальных и вертикальных границ.
Старый 16.10.2023, 11:28   #12  
LETTO is offline
LETTO
Участник
 
318 / 64 (3) ++++
Регистрация: 14.07.2022
Цитата:
Сообщение от DesparioN Посмотреть сообщение
Если не сложно, можете раскрыть тему более подробно?

X++:
System.Type                                                     enumValue;
System.Reflection.MethodInfo                          methodInfo;


enumValue = System.Type::GetType("DocumentFormat.OpenXml.EnumValue`1");
methodInfo = enumValue.GetMethod("Value");
А что собственно дальше?

В частности мне надо в DocumentFormat.OpenXml.Spreadsheet.Alignment указать значение для горизонтальных и вертикальных границ.
Коллеги, может у кого есть пример создания типа "DocumentFormat.OpenXml.EnumValue`1" в аксапте. Уже голову сломал.
Вот тут хороший пример:
https://wiki.programstore.ru/primer-...rammy-v-excel/
Но там используется метод OXMLExp::getEnumValue(), а кода нет.

В reflection более менее разбираюсь. Но всё равно не выходит

ЗЫ Ну а если есть готовый код по вставке картинки в XMLExcelReport_RU в XML буду оооочень благодарен.

На С# вот такой простой код:
X++:
            DocumentFormat.OpenXml.EnumValue<DocumentFormat.OpenXml.Drawing.BlipCompressionValues> value;

            value = new DocumentFormat.OpenXml.EnumValue<DocumentFormat.OpenXml.Drawing.BlipCompressionValues>(DocumentFormat.OpenXml.Drawing.BlipCompressionValues.Print);
В аксапте возвращает null (тот же код в C# выдает значение)
X++:
    enumObject = CLRInterop::parseClrEnum('DocumentFormat.OpenXml.Drawing.BlipCompressionValues', 'Print');

    enumType = System.Type::GetType("DocumentFormat.OpenXml.Drawing.BlipCompressionValues, DocumentFormat.OpenXml, Version=2.5.5631.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35");
    enumValueType = System.Type::GetType("DocumentFormat.OpenXml.EnumValue`1, DocumentFormat.OpenXml, Version=2.5.5631.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35");

    typeParams = new System.Type[1]();
    typeParams.SetValue(enumType, 0);

    genericType = enumValueType.MakeGenericType(typeParams);

    Object = System.Activator::CreateInstance(genericType, 
              CLRInterop::parseClrEnum('DocumentFormat.OpenXml.Drawing.BlipCompressionValues', 'Print'));

Последний раз редактировалось LETTO; 16.10.2023 в 13:08.
Старый 20.07.2022, 20:38   #13  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
.NET Generic
Старый 20.07.2022, 20:39   #14  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
OpenXml. C# -> X++
Старый 20.07.2022, 20:41   #15  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
параметры типов (type parameters) в Ax
Старый 21.07.2022, 00:04   #16  
DesparioN is offline
DesparioN
Участник
 
86 / 15 (1) ++
Регистрация: 21.10.2014
Я это все досконально прочитал. Но к сожалению знаний в данной области почти никаких

В частности я не понял нескольких моментов:
1) я присвоил enumValue тип, объявил нужный метод. Далее написал
X++:
parameters = new System.Object[1]();
parameters.SetValue(1, 1);
methodInfo.Invoke(enumValue, parameters);
Правильно ли я понял что теперь значение енума у меня 1?

2) Далее, если предположение верно, получается я должен таким же образом проработать Alignment? Т.е. объявляю его через GetType, присваиваю methodInfo значение Set_Horizontal, и уже через Invoke кладу полученный енум?

Вообще есть какой-то мануал, который был бы понятен чайникам, чтобы не позориться на форуме? А то кроме axforum больше не откуда получить консультацию.
Старый 21.07.2022, 11:46   #17  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Не могу детально пояснить. Очень большая загруженность сейчас.
Просто внимательно посмотрите примеры данные по ссылкам.
Там все работает аналогично вызовам методов через SysDictClass / SysDictTable
Старый 16.10.2023, 13:10   #18  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Готового примера нет.

Но как я понимаю, вам надо не дженерик тип вызвать, а дженерик конструктор для типа "DocumentFormat.OpenXml.EnumValue`1"
т.е. сам этот тип "DocumentFormat.OpenXml.EnumValue`1" не получится использовать, нужно конкретный производный тип подставить.

Копайте в эту сторону.

У меня была похожая задача.
Делали обмен с кафкой, используя .net компонент Confluent.Kafka.dll
там вся библиотека построена на дженериках.

и для того чтобы заменить одну строку C# кода такого вида
X++:
consumer = new ConsumerBuilder<String, String>(config).Build();
в джобе пришлось написать десяток строк кода.
Сначала создаем в аксапте объект с типом Confluent.Kafka.ConsumerBuilder`2
а затем для него создаем экземпляр System.Reflection.ConstructorInfo
constructorInfo = System.Type.GetConstructor(...)
при помощи которого уже и вызываем конструктор типа
X++:
new ConsumerBuilder<String, String>
Во вложении простой проект с примером джобика (KafkaGenericTest) и ссылками на документацию
Я поигрался недавно с этим, получил рабочий код, но пока отложил, так как коллега написал сборку обертку, которая в аксапту выставляет классы обертки над дженериками, так что без всего этого можно обойтись стало.
Вложения
Тип файла: zip PKoz_NetGenericConstructor_dev.zip (7.7 Кб, 122 просмотров)

Последний раз редактировалось Logger; 16.10.2023 в 13:18.
За это сообщение автора поблагодарили: LETTO (3).
Старый 16.10.2023, 13:42   #19  
LETTO is offline
LETTO
Участник
 
318 / 64 (3) ++++
Регистрация: 14.07.2022
Цитата:
Сообщение от Logger Посмотреть сообщение
Копайте в эту сторону.
constructorInfo = System.Type.GetConstructor(...)
Спасибо огромное
Object удалось получить. И вроде даже все как надо.
Старый 16.10.2023, 13:17   #20  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Dll-ка кафки нужной версии во вложении
Вложения
Тип файла: zip Confluent.Kafka.zip (89.0 Кб, 101 просмотров)
Теги
.net, ado, generic, net

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
emeadaxsupport: When browsing AX 2009 Role Centers, you get an error: An unexpected error has occurred on systems with .NET Framework v4.0 installed Blog bot DAX Blogs 1 28.07.2010 08:24
AX.NET: интеграция .NET-приложений с Аксаптой и (будущие) возможности облачных вычислений gl00mie DAX: Программирование 2 23.04.2010 00:47
jinx: Microsoft Dynamics AX und .NET - Erstellen eines Termins in Outlook Blog bot DAX auf Deutsch 0 03.11.2007 00:33
Inside Dynamics AX 4.0: Working with the .NET Business Connector Blog bot DAX Blogs 0 04.10.2007 05:15
Как при импорте задать значение определенного поля? mvf DAX: Программирование 3 04.05.2005 16:26
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 09:23.