01.07.2020, 18:34 | #1 |
Участник
|
Query (как строка) - как прочитать в Query object?
Привет Аксаптоведы!
Что-то я подзабыл чуть игрушки с контейнерами У меня есть упакованная квери в строковом виде, типа 0x07FD30070300004A012F273500360.....FF Из Х++ хочу эту строку преобразовать в Query (или QueryRun) объект Пробовал BinData::stringToData(), ContainerClass::blobToContainer(), но что-то как-то все неудачно. Хелп |
|
01.07.2020, 18:53 | #2 |
Участник
|
Пример, чтоб было понятнее
X++: public static void main(Args _args) { str val = "0x07FD30C10400004A012F27330035003600330037003100350031003300340037007C00330035003600330037003100350031003300340039000000110001E8033000330035003600330037003100350031003300340037007C00330035003600330037003100350031003300340039000000E649A10000000A4DF70300000000840457004D0053004C006F0063006100740069006F006E000000110001E803180057004D0053004C006F0063006100740069006F006E000000E209180057004D0053004C006F0063006100740069006F006E000000094DE80300000000920402001100010000FFFFFFFF860469006E00760065006E0074004C006F0063006100740069006F006E00490064000000110001E803220069006E00760065006E0074004C006F0063006100740069006F006E00490064000000E209180057004D0053004C006F0063006100740069006F006E000000D60D180057004D0053004C006F0063006100740069006F006E000000E309220069006E00760065006E0074004C006F0063006100740069006F006E00490064000000DA69360031000000C41901000000000001860477004D0053004C006F0063006100740069006F006E00490064000000110001E8031C0077004D0053004C006F0063006100740069006F006E00490064000000E209180057004D0053004C006F0063006100740069006F006E000000D60D180057004D0053004C006F0063006100740069006F006E000000E3091C0077004D0053004C006F0063006100740069006F006E00490064000000DA09420030003200410030003100520035005300310042002C0030003200410030003100520035005300320042002C0030003200410030003200520031005300310042000000000000000001FFFF840449006E00760065006E007400440069006D000000110001E803140049006E00760065006E007400440069006D000000E209140049006E00760065006E007400440069006D000000094DE9030000D91900DF19010000920402001100010000FFFFFFFFFFFF840449006E00760065006E007400530075006D000000110001E803140049006E00760065006E007400530075006D000000E209140049006E00760065006E007400530075006D000000094DEA030000D91900DF19010000920402001100010000FFFFFFFF860450006800790073006900630061006C0049006E00760065006E0074000000110001E8031E0050006800790073006900630061006C0049006E00760065006E0074000000E209140049006E00760065006E007400530075006D000000D60D140049006E00760065006E007400530075006D000000E3091E0050006800790073006900630061006C0049006E00760065006E0074000000DA693E0030000000C4190100000000000186044900740065006D00490064000000110001E8E34900740065006D00490064000000E209140049006E00760065006E007400530075006D000000D60D140049006E00760065006E007400530075006D000000E3E94900740065006D00490064000000DAC9540030003100300030000000000000000001FFFFFFFF8F04FFFF00000000000000FFFF8F04FFFF00000000000000FFFF9B04FFFF9A04FFFF00000000000001FFFFFFFF009005000000000000000000000000000000000000000000000000000000000000FF"; var qCon = BinData::stringToData(val); QueryRun qr = new QueryRun(qCon); } |
|
01.07.2020, 18:55 | #3 |
Участник
|
Ошибки:
Bad container. Object 'Query' could not be created Unable to create queryRun Object 'QueryRun' could not be created |
|
01.07.2020, 20:36 | #4 |
Участник
|
А как получена эта строка?
контейнер с точки зрения CLR это массив объектов (object[]) НО есть специальный вид контейнеров, которые отвечают за бинарные данные - это object[] в котором лежит единственный элемент типа byte[]. Когда объект упаковывается он собирает обычные контейнеры. В Clr это будет, например new object[]{1, 2, 3} Сответственно, такой контейнер нельзя запихать в BinData и наоборот. Так как он работает только с new object{}{new byte[]{1, 2, 3}}. |
|
01.07.2020, 20:40 | #5 |
Участник
|
Строка взята из SQL из поля таблицы, в котором упакована квери
|
|
02.07.2020, 08:05 | #6 |
Участник
|
А не в первых ли шести байтах проблема? Axapta и BLOB поля
|
|
02.07.2020, 10:19 | #7 |
Moderator
|
Мне кажется проблема в том, что Ванина строка - это не реальная binary string, а вполне себе строчный hexdump двоичной строки. Чтобы с ней что-то делать, надо последовательно, каждые два символа засунуть в num2char(hex2int(substr(...))), потом результаты собрать в уже настоящую двоичную строку и уже ее пробовать передать в BinData::stringtoData()
|
|
02.07.2020, 14:33 | #8 |
Участник
|
Решил по-другому чуть, но вообще как-то странно.
Я почти уверен, что я что-то такое уже раньше делал без особых проблем. Спасибо за ответы, и всем привет! |
|
02.07.2020, 14:37 | #9 |
Moderator
|
Отвечу в духе вашего Джориса.
|
|
07.07.2020, 13:20 | #10 |
Участник
|
ContainerClass с BinData надо объединить
И "0x" из строки выкинуть X++: var qCon = ContainerClass::blob2Container(BinData::stringToData(val));
__________________
Axapta v.3.0 sp5 kr2 |
|
|
За это сообщение автора поблагодарили: trud (2), Logger (5), Raven Melancholic (2). |