30.12.2014, 08:57 | #1 |
Участник
|
Что делает метод SysQuery::isPackedOk()?
Здравствуйте.
Что делает метод SysQuery::isPackedOk()? НЕ нашел описания в мсдн и книгах. |
|
30.12.2014, 09:14 | #2 |
Участник
|
Откройте у себя в приложении его текст и посмотрите \Classes\SysQuery\isPackedOk
X++: /*MAN Method to test a packed queryrun container is legal. */ public static boolean isPackedOk(PackedQueryRun packed) { boolean ret; ret = packed && conlen(packed) > 0; return ret; } |
|
30.12.2014, 13:23 | #3 |
Участник
|
Во всяких RunBase'ах, если они предоставляют пользователю интерактивный QueryRun для выборки обрабатываемых данных (см. также showQueryValues()), принято паковать Query/QueryRun для маршаллинга между клиентом и сервером, а также сохранения в SysLastValue. Из-за изменений в упаковываемых параметрах по мере изменения класса может случиться так, что полученный из SysLastValue набор сохраненных параметров уже не содержит упакованный Query/QueryRun - вообще либо в ожидаемой позиции контейнера. Чтобы не словить из-за этого ошибку времени выполнения, в unpack() такого класса-наследника RunBase обычно проверяют, можно ли распаковать Query/QueryRun из параметров, для чего в первом приближении и предназначен указанный метод. Однако, у него есть один фатальный недостаток Упакованный Query/QueryRun - это контейнер из одного значения типа BLOB, а метод не проверяет, какого именно типа значение содержится в контейнере, так что если там будет int или real, метод не почует подвоха, и вы все равно словите ошибку времени выполнения. Корректнее было бы дополнить метод такой проверкой:
X++: ret = ret && typeOf(conPeek(packed, 1)) == Types::BLOB; |
|
30.12.2014, 17:59 | #4 |
Участник
|
спасибо.
|
|
|
|