powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / как записать в глобал данные без перекодирования?
13 сообщений из 13, страница 1 из 1
как записать в глобал данные без перекодирования?
    #36988144
Hisbreht Victor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Усть некоторая последовательность байт, которую надо записать в глобал как есть, без перекодирования.
Как этого добиться?
Доступ осуществляется при помощи ActiveX из Delphi.

Пробовал это делать так: в БД у одного из классов создал метод

Код: plaintext
1.
2.
3.
4.
ClassMethod SetRawData(gname as %String, gdata as %String) as %Status
{
  s @gname=gdata
  q  1 
}

При вызове из Delphi в глобал попадают искаженные данные.
Пробовал менять тип второго параметра на %Binary. В этом случае в глобал записывается пустая строка.
Подозреваю, что переход с Delphi на более другой язык программирования ничего не даст.

Что посоветуете?
...
Рейтинг: 0 / 0
как записать в глобал данные без перекодирования?
    #36988168
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Внутри каше проблем не должно быть.
Снаружи если смысл во что-нибудь перекодировать строку, а внутри каше перекодировать обратно.
Тогда в глобале она будет как есть, без перекодирвоания.

А какого типа искажения?
...
Рейтинг: 0 / 0
как записать в глобал данные без перекодирования?
    #36988315
Turk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Hisbreht Victor ,
Не сталкивался с подобными проблемами, хотя связку ActiveX+Delphi используем регулярно.
1. Возможно у Вас Delphi 2009+, а там по умолчанию используются Unicode-строки.
2. Преобразуйте строку в соответствующую ей 16-ричную строку и передавайте в Cache. На стороне Cache нужно будет сделать обратное преобразование.
...
Рейтинг: 0 / 0
как записать в глобал данные без перекодирования?
    #36988344
neznau
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hisbreht Victor,

Передавайте двоичные данные через base64.
Каше умеет декодировать (см. %SYSTEM.Encryption ), дельфи, наверняка, умеет кодировать в него ( первая ссылка ).
...
Рейтинг: 0 / 0
как записать в глобал данные без перекодирования?
    #36988346
neznau
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hisbreht Victor,

и еще, что говорит
Код: plaintext
w $zv
?
...
Рейтинг: 0 / 0
как записать в глобал данные без перекодирования?
    #36988646
Hisbreht Victor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
$zv говорит, что 32 бит 2009.1.3

Ситуация складывается следующая.
Если параметром передаю AnsiString с данными, то сначала преобразует в уникод, потом в UTF-8. Не уверен, что преобразование происходит без потерь.
Если используется WideString, то его просто преобразует в UTF-8
После преобразований и возвращения назад данные нечетной длины увеличиваются на 1 байт.
Опять же, нет уверенности в том, что преобразования пройдут без потерь.
...
Рейтинг: 0 / 0
как записать в глобал данные без перекодирования?
    #36988716
misha_shar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Hisbreht Victor,

Данные можно передать по TCP/IP каналу побайтно в CACHE читать тоже побайтно через R *C.
Все должно пройти.
...
Рейтинг: 0 / 0
как записать в глобал данные без перекодирования?
    #36992182
Hisbreht Victor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В итоге решил все передачей через сокет.
Могу ошибаться, но, как мне кажется, это костыль.
Было бы логично наличие типа параметра, который всегда передается без перекодирования (какой-нибудь binary).
Я пробовал использовать %Binary, но в этом случае результат был вообще странным, из чего я заключил, что это не то, что я думал (я полагал, что это что-то вроде BLOB в других БД).
...
Рейтинг: 0 / 0
как записать в глобал данные без перекодирования?
    #36992562
Turk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Hisbreht Victor$zv говорит, что 32 бит 2009.1.3

Ситуация складывается следующая.
Если параметром передаю AnsiString с данными, то сначала преобразует в уникод, потом в UTF-8. Не уверен, что преобразование происходит без потерь.
Если используется WideString, то его просто преобразует в UTF-8
После преобразований и возвращения назад данные нечетной длины увеличиваются на 1 байт.
Опять же, нет уверенности в том, что преобразования пройдут без потерь.
Сделал тестовый код (BDS 2006):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
var
 buf : AnsiString;
begin
  buf := '';
  for i :=  0  to  255  do
    buf := buf + Chr(i);
  //
  objTest.SaveBinary('^CacheTemp.TestBinary', buf);
end;
, где
Код: plaintext
1.
2.
3.
4.
5.
ClassMethod SaveBinary(Global As %String, Data As %String) As %String
{
  s @Global = Data
  q ""
}
Пробовал запускать в связке как с Cache 5.0.21 (через 'CacheObject.Factory'), так и с Cache 2009.1.5 (через 'CacheActiveX.Factory') - все нормально сохраняется.
Если тип Data изменить на %Binary, то начинаются проблемы: в Cache 5.0 приходит Unicode-строка, а в Cache 2009.1.5 - пустая строка.
...
Рейтинг: 0 / 0
как записать в глобал данные без перекодирования?
    #36992929
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hisbreht Victor, $zv вы так и не привели. Может быть, у вас Unicode-ная установка Cache?
...
Рейтинг: 0 / 0
как записать в глобал данные без перекодирования?
    #36993231
misha_shar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А мне кажется проблеммы в Delphi. Может он всегда перекодирует строку. А кастыль мне нравится больше. Я весь обмен гоню через TCP/IP. А VisM использую только для запуска сервера на CACHE.
...
Рейтинг: 0 / 0
как записать в глобал данные без перекодирования?
    #36993975
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hisbreht Victor

С %Binary тоже всё работает:
Код: plaintext
1.
2.
3.
4.
5.
ClassMethod SaveBinary(A As %Binary)
{
  k ^test
  set ^test=A
}
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
var i:byte;
    arr:Variant;
begin
  arr:=VarArrayCreate([ 0 , 255 ],varByte);
  for i:= 0  to  255  do arr[i]:=i;

  f := CreateOleObject('CacheActiveX.Factory');

  ...

  f.Static('pas.test').SaveBinary(VarToWideStr(arr));
Тестировал на Delphi 6 и Caché 2010.2.1 (8-бит и Unicode).
...
Рейтинг: 0 / 0
как записать в глобал данные без перекодирования?
    #36995005
Hisbreht Victor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alexey MaslovHisbreht Victor, $zv вы так и не привели. Может быть, у вас Unicode-ная установка Cache?
Unicode.
Но это дела, как мне кажется, не меняет.
Если я правильно понимаю, то Cache при обращении через ActiveX всегда пытается перекодировать строку из кодировки "клиентской" в свою (В моем случае ANSI и UTF-16 в UTF-8). В принципе оно даже логично и часто даже полезно.
В принципе проблема решаема разными способами (я уже решил), но мне все-таки представляется логичным, чтобы была возможность передать данные без преобразования в любом случае.

Надо будет попробовать более свежие версии Cache.
И, может быть, сработает конструкция, аналогичная следующей:
Код: plaintext
1.
2.
  arr:=VarArrayCreate([ 0 , 255 ],varByte);
  for i:= 0  to  255  do arr[i]:=i;
присутствующей в коде, представленном servit.
Насколько я понимаю, она должна сформировать данные, которые будут соответствовать типу %Binary в Cache.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / как записать в глобал данные без перекодирования?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]