|
15.10.2011, 16:21 | #1 |
Участник
|
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 и System.Data.CommandType::StoredProcedure Выдает синтаксическую ошибку. |
|
15.10.2011, 16:33 | #2 |
Участник
|
Есть перечислимый тип 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 |
Участник
|
Вот такой джоб у меня работает
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 |
Участник
|
А вот если использовать при вызове 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 |
Участник
|
У меня ругается не на этапе выполнения, а на этапе компиляции на:
Цитата:
command.set_CommandType(System.Data.CommandType::StoredProcedure);
ЗЫ: в стандартной DAX4 в этой ветке:
PSS: кстати, время от времени у меня ссылка System.Data пропадает из ветки References. |
|
15.10.2011, 17:19 | #6 |
Участник
|
Узел References приведен на рисунке.
|
|
|
За это сообщение автора поблагодарили: Raven Melancholic (5). |
15.10.2011, 22:20 | #7 |
Administrator
|
В этой теме : проблема использования Excel через clr
значение енума достается через конструкцию: X++: fileFormat = ClrInterop::parseClrEnum('Microsoft.Office.Interop.Excel.XlFileFormat', 'xlTextWindows');
__________________
Возможно сделать все. Вопрос времени |
|
|
За это сообщение автора поблагодарили: Raven Melancholic (5). |
16.10.2011, 09:59 | #8 |
Участник
|
Цитата:
X++: System.Data.CommandType type; ; type= ClrInterop::parseClrEnum('System.Data.CommandType', 'StoredProcedure'); command.set_CommandType(type); |
|
22.04.2015, 17:35 | #9 |
Участник
|
тут проблема не в перечислении а в генерике
в ах вроде нет поддержки таких, только через обжегд с ними можно работать Последний раз редактировалось lvan; 22.04.2015 в 17:42. |
|
|
За это сообщение автора поблагодарили: Товарищ ♂uatr (0). |
22.04.2015, 21:32 | #10 |
Участник
|
|
|
|
За это сообщение автора поблагодарили: Товарищ ♂uatr (1). |
20.07.2022, 18:05 | #11 |
Участник
|
Если не сложно, можете раскрыть тему более подробно?
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 |
Участник
|
Цитата:
Сообщение от 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 указать значение для горизонтальных и вертикальных границ. Вот тут хороший пример: 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); 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 |
Участник
|
|
|
20.07.2022, 20:39 | #14 |
Участник
|
|
|
21.07.2022, 00:04 | #16 |
Участник
|
Я это все досконально прочитал. Но к сожалению знаний в данной области почти никаких
В частности я не понял нескольких моментов: 1) я присвоил enumValue тип, объявил нужный метод. Далее написал X++: parameters = new System.Object[1]();
parameters.SetValue(1, 1);
methodInfo.Invoke(enumValue, parameters); 2) Далее, если предположение верно, получается я должен таким же образом проработать Alignment? Т.е. объявляю его через GetType, присваиваю methodInfo значение Set_Horizontal, и уже через Invoke кладу полученный енум? Вообще есть какой-то мануал, который был бы понятен чайникам, чтобы не позориться на форуме? А то кроме axforum больше не откуда получить консультацию. |
|
21.07.2022, 11:46 | #17 |
Участник
|
Не могу детально пояснить. Очень большая загруженность сейчас.
Просто внимательно посмотрите примеры данные по ссылкам. Там все работает аналогично вызовам методов через SysDictClass / SysDictTable |
|
16.10.2023, 13:10 | #18 |
Участник
|
Готового примера нет.
Но как я понимаю, вам надо не дженерик тип вызвать, а дженерик конструктор для типа "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> Я поигрался недавно с этим, получил рабочий код, но пока отложил, так как коллега написал сборку обертку, которая в аксапту выставляет классы обертки над дженериками, так что без всего этого можно обойтись стало. Последний раз редактировалось Logger; 16.10.2023 в 13:18. |
|
|
За это сообщение автора поблагодарили: LETTO (3). |
16.10.2023, 13:42 | #19 |
Участник
|
|
|
16.10.2023, 13:17 | #20 |
Участник
|
Dll-ка кафки нужной версии во вложении
|
|
Теги |
.net, ado, generic, net |
|
|