|
|
|
|
#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 Выдает синтаксическую ошибку. |
|
|
|
|
#2 |
|
Участник
|
Есть перечислимый тип System.Data.CommandType
X++: command.set_CommandType(System.Data.CommandType::Text); Последний раз редактировалось Ace of Database; 15.10.2011 в 16:35. |
|
|
|
|
#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. |
|
|
|
|
#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)); |
|
|
|
|
#5 |
|
Участник
|
У меня ругается не на этапе выполнения, а на этапе компиляции на:
Цитата:
command.set_CommandType(System.Data.CommandType::StoredProcedure);
ЗЫ: в стандартной DAX4 в этой ветке:
PSS: кстати, время от времени у меня ссылка System.Data пропадает из ветки References. |
|
|
|
|
#6 |
|
Участник
|
Узел References приведен на рисунке.
|
|
|
|
| За это сообщение автора поблагодарили: Raven Melancholic (5). | |
|
|
#7 |
|
Administrator
|
В этой теме : проблема использования Excel через clr
значение енума достается через конструкцию: X++: fileFormat = ClrInterop::parseClrEnum('Microsoft.Office.Interop.Excel.XlFileFormat', 'xlTextWindows');
__________________
Возможно сделать все. Вопрос времени |
|
|
|
| За это сообщение автора поблагодарили: Raven Melancholic (5). | |
|
|
#8 |
|
Участник
|
Цитата:
X++: System.Data.CommandType type;
;
type= ClrInterop::parseClrEnum('System.Data.CommandType', 'StoredProcedure');
command.set_CommandType(type); |
|
|
|
|
#9 |
|
Участник
|
тут проблема не в перечислении а в генерике
в ах вроде нет поддержки таких, только через обжегд с ними можно работать Последний раз редактировалось lvan; 22.04.2015 в 17:42. |
|
|
|
| За это сообщение автора поблагодарили: Товарищ ♂uatr (0). | |
|
|
#10 |
|
Участник
|
|
|
|
|
| За это сообщение автора поблагодарили: Товарищ ♂uatr (1). | |
|
|
#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 указать значение для горизонтальных и вертикальных границ. |
|
|
|
|
#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. |
|
|
|
|
#13 |
|
Участник
|
|
|
|
|
|
#14 |
|
Участник
|
|
|
|
|
|
#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 больше не откуда получить консультацию.
|
|
|
|
|
#17 |
|
Участник
|
Не могу детально пояснить. Очень большая загруженность сейчас.
Просто внимательно посмотрите примеры данные по ссылкам. Там все работает аналогично вызовам методов через SysDictClass / SysDictTable |
|
|
|
|
#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). | |
|
|
#19 |
|
Участник
|
|
|
|
|
|
#20 |
|
Участник
|
|
|
|
| Теги |
| .net, ado, generic, net |
|
|
|