powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Привести тип или вернуть курсор клиенту с удаленного COM-сервера
26 сообщений из 26, показаны все 2 страниц
Привести тип или вернуть курсор клиенту с удаленного COM-сервера
    #32896829
Dushes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет всем. Вот, возникла проблема, не могу обойти.
Суть такая, есть удаленный com-сервер, к которому обращается клиент, в com-сервере прошита бизнесс-логика программы, т.е. система базовых классов, таких к примеру как документ с табличной частью. Таблица формируется в результате запроса к mssql, т.е. на стороне com-сервера данные получаю, проблема же в передаче полученного курсора на сторону клиента.

Пока решение видел, до текущего момента, в следующем.
В классе документа (на стороне сервера в части бизнесс-логики) есть пропертя класса XmlAdapter, в котором и хранится в виже xml данный курсор (собственно табличная часть документа), на стороне клиента имею ссылку на удаленный объект бизнесс-класса, имею данную пропертю, но не могу обратиться к ней как к объекту XmlAdapter-класса, дебаггер видит ее как просто Object//// Дык вот - можно ли как нить привести тип данной проперти (Object) к типу XmlAdapter ///???

Вообще, есть ли другой какой нибудь способ передать данные курсора (в виде xml или еще как) c удаленного com-сервера на сторону клиента ? Вариант резать полученный xml по строчкам не пойдет, так как вопрос производительности решения также важен...

С уважением
duШes
....return ThisForm.exGrid1.p_oColumns("COLUMN1").M_AddHeader("header4",4)
...
Рейтинг: 0 / 0
Привести тип или вернуть курсор клиенту с удаленного COM-сервера
    #32897010
kdanylo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Просмотрите пример Веб-Сервиса, который идет с 8-кой.
Там СОМ сервер возвращает чистый XML. Клиент с помощью XMLAdapter конвертирует обратно в курсор (если ХМL содержит несколько таблиц - иерархический документб сответственно формируется несколько курсоров). Все красиво и просто.
...
Рейтинг: 0 / 0
Привести тип или вернуть курсор клиенту с удаленного COM-сервера
    #32897026
Dushes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно поподробнее...куда смотреть?
для меня xml seb services почему-то прочно ассоциируюся с .net...
...
Рейтинг: 0 / 0
Привести тип или вернуть курсор клиенту с удаленного COM-сервера
    #32897033
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторВообще, есть ли другой какой нибудь способ передать данные курсора (в виде xml или еще как) c удаленного com-сервера на сторону клиента?

Как-то делал, примерно так

На стороне сервера

Код: plaintext
1.
2.
3.
SELECT * FROM MyTable INTO CURSOR Tmp

CursorToXML('Tmp', 'ComServer.XMLRet' )
* XMLRet - пропертя COM-сервера

На стороне клиента

Код: plaintext
1.
ClientObject.Property = CREATEOBJECT(COMServer)
XMLTOCURSOR(ClientObject.Property.XMLRet,'Tmp')

Надо сказать, что скорость ещё та получается, хотя ~ 1000 записей тянутся за приемлемое время.
...
Рейтинг: 0 / 0
Привести тип или вернуть курсор клиенту с удаленного COM-сервера
    #32897119
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PaulWist Надо сказать, что скорость ещё та получается, хотя ~ 1000 записей тянутся за приемлемое время.
Если записей больше, то преобразуете в текст с разделителями и тянете уже его... Получется гораздо быстрее (но не так современно)
...
Рейтинг: 0 / 0
Привести тип или вернуть курсор клиенту с удаленного COM-сервера
    #32897162
kdanylo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно поподробнее...куда смотреть?

C:\Program Files\Microsoft Visual FoxPro 8\Samples\WebServices\Northwind

для меня xml seb services почему-то прочно ассоциируюся с .net...

Еще java, perl, Visual FoxPro :)
...
Рейтинг: 0 / 0
Привести тип или вернуть курсор клиенту с удаленного COM-сервера
    #32897174
Dushes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PaulWist...
Как-то делал, примерно так

На стороне сервера

Код: plaintext
1.
2.
3.
SELECT * FROM MyTable INTO CURSOR Tmp

CursorToXML('Tmp', 'ComServer.XMLRet' )
* XMLRet - пропертя COM-сервера

На стороне клиента

Код: plaintext
1.
ClientObject.Property = CREATEOBJECT(COMServer)
XMLTOCURSOR(ClientObject.Property.XMLRet,'Tmp')

Надо сказать, что скорость ещё та получается, хотя ~ 1000 записей тянутся за приемлемое время.

Пропертя может быть всего 16 кб, если у меня курсор с большим объемом данных, то придется парсить, а это уже потеря производительности :(+ предварительная проверка на объем полученного xml как лишняя операция

я, в принципе, рассматривал такой вариант, но уж больно некрасиво это...жаль что в фоксе нет приведения типов (оно конечно есть с простыми типами, простые типы для фокса это чтото вроде Variant-структуры)
...
Рейтинг: 0 / 0
Привести тип или вернуть курсор клиенту с удаленного COM-сервера
    #32897222
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторПропертя может быть всего 16 кб, если у меня курсор с большим объемом данных, то придется парсить, а это уже потеря производительности :(+ предварительная проверка на объем полученного xml как лишняя операция

Из этого положения ес-но можно вывернуться.

автор...жаль что в фоксе нет приведения типов

не я этого не утверждал, просто не знаю как можно реализовать. Для моей задачи вполне хватило проперти массива.
...
Рейтинг: 0 / 0
Привести тип или вернуть курсор клиенту с удаленного COM-сервера
    #32897246
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dushes Пропертя может быть всего 16 кб, если у меня курсор с большим объемом данных, то придется парсить, а это уже потеря производительности :(+ предварительная проверка на объем полученного xml как лишняя операция
Вы говорите на каком-то непонятном языке...

Передать на клиент можно 16 Mb если об этом идет речь...Ну а преобразование из данных -> в XML а на клиенте из XML -> в данные все это от "лукавого" - можно передать сразу готовую таблицу или, что быстрее - текст с разделителями...
...
Рейтинг: 0 / 0
Привести тип или вернуть курсор клиенту с удаленного COM-сервера
    #32897280
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати
VFP3
VFP5
Maximum # of characters per character string 2 gigabytes

VFP5 - 9
Maximum # of characters per character string or memory variable
16,777,184

Sergey Ch

Sergey Chможно передать сразу готовую таблицу

Приведите, пожалуйста пример.
...
Рейтинг: 0 / 0
Привести тип или вернуть курсор клиенту с удаленного COM-сервера
    #32897333
Dushes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sergey Ch
Передать на клиент можно 16 Mb если об этом идет речь...Ну а преобразование из данных -> в XML а на клиенте из XML -> в данные все это от "лукавого" - можно передать сразу готовую таблицу или, что быстрее - текст с разделителями...

Насчет 16 мб - с этим согласен, ответил неподумав...а вот насчет передачи сразу же готовой таблицы - оригинально;)))) , не подскажете как?
Вся com-технология (имею в виду в рамках фокса) базируется на передаче простых типов, построенных на базе Variant, а вот если потребуется передать объект какого-либо класса, придется писать stup|proxy и реализовать свой маршаллинг...поясните мне плиз, как это можно вообще реализовать на фоксе?
Да бог с ним реализовать..допустим такой сервер я напишу...но покажите мне как я смогу на стороне клиента в фоксе реализовать такой маршаллинг?
...
Рейтинг: 0 / 0
Привести тип или вернуть курсор клиенту с удаленного COM-сервера
    #32897541
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DushesНасчет 16 мб - с этим согласен, ответил неподумав...а вот насчет передачи сразу же готовой таблицы - оригинально;)))) , не подскажете как?

Очень просто - загнать таблицу в поле BINARY MEMO таблицы (курсора) с одной строкой - затем преобразовать в XML как BINARY поле - далее этот XML файл передается на клиент где из XML мгновенно вытаскивается одна строка в курсор а далее из BINARY MEMO таблица записвается на диск...

Работает на несколько порядков быстрее чем стандартный подход в XML Хотя тут XML присутствует - одна строка

Если все еще нужен пример кода - скажите - пришлю...
...
Рейтинг: 0 / 0
Привести тип или вернуть курсор клиенту с удаленного COM-сервера
    #32897553
Crip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блин все надо делать через XmlAdapter, а не через простой но убогий, глючный и тормозной CursorToXml().
В чем проблема я вообще не понимаю?
...
Рейтинг: 0 / 0
Привести тип или вернуть курсор клиенту с удаленного COM-сервера
    #32897601
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey Chдалее этот XML файл передается на клиент

какой механизм передачи используется, те как клиент этот файл получит, через что?
...
Рейтинг: 0 / 0
Привести тип или вернуть курсор клиенту с удаленного COM-сервера
    #32897661
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CripБлин все надо делать через XmlAdapter, а не через простой но убогий, глючный и тормозной CursorToXml().

Кстати, Crip дело говорит, попытай этот вариант.
...
Рейтинг: 0 / 0
Привести тип или вернуть курсор клиенту с удаленного COM-сервера
    #32897721
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CripБлин все надо делать через XmlAdapter, а не через простой но убогий, глючный и тормозной CursorToXml().
В чем проблема я вообще не понимаю?
- XmlAdapter работает очень долго (медленно) с большими файлами
- CursorToXml() работает быстро, надежно (боюсь, что Вы его спутали с XmlToCursor())

P.S. Мы уже кажется тут выясняли про скорость работы XmlAdapter но к сожалению каждый остался при своем мнении
...
Рейтинг: 0 / 0
Привести тип или вернуть курсор клиенту с удаленного COM-сервера
    #32897752
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PaulWist какой механизм передачи используется, те как клиент этот файл получит, через что?

Я использую стандартный пакет SOAP 3.0 (не тот что идет в комплекте с VFP а немного более свежий с MS сайта, НО - он не будет скоро больше поддерживаться Большим братом, по этому смотрю в сторону разрабртки Web Services на основе .NET)

Хорошая статья о XMLAdapter тут:

тынц

Good luck!
...
Рейтинг: 0 / 0
Привести тип или вернуть курсор клиенту с удаленного COM-сервера
    #32898182
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi Dushes!

Значительно проще и быстрее будет вернуть данные в виде строки - неважно
будет это XML полученный из таблицы, или собственно таблица, полученная как
FILETOSTR() и закодированная в BASE64 через SDRCONV() 2 Sergey - не
нужно лишних телодвижений с memo binary.
Кстати получаемая по FILETOSTR() строка может быть и больше 16 Mb - там
как-то по другому ограничение считается, НО моё глубокое убеждение состоит в
том, что ТАКИЕ объёмы данных через COM вынимать не стоит ни в коем случае.

Кстати насчёт скорости разбора XML - тут оказывается огромное значение имеет
флаг "Preserve white space" - где-то это подробно обсуждалось, то-ли в FIDO,
то-ли тут, то-ли на foxclub.ru...

Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
Привести тип или вернуть курсор клиенту с удаленного COM-сервера
    #32898404
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Igor Korolyov
FILETOSTR() и закодированная в BASE64 через SDRCONV() 2 Sergey - не
нужно лишних телодвижений с memo binary.
Пробовал, но у меня получалось медленнее чем я остановился на варианте:

APPEND MEMO body FROM (UPPER(m.lctxtfile)) OVERWRITE

Сейчас в реале уже более 6 месяцев гоняется по несеольку раз в день 4 и 12 Mbytes... Все очень быстро по выделенным каналам связи :) Ну а сами преобразрвания таких объемов занимают секунды

Good luck!
...
Рейтинг: 0 / 0
Привести тип или вернуть курсор клиенту с удаленного COM-сервера
    #32898409
Dushes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Igor Korolyov
Hi Dushes!

Значительно проще и быстрее будет вернуть данные в виде строки - неважно
будет это XML полученный из таблицы, или собственно таблица, полученная как
FILETOSTR() и закодированная в BASE64 через SDRCONV() 2 Sergey - не
нужно лишних телодвижений с memo binary.
Кстати получаемая по FILETOSTR() строка может быть и больше 16 Mb - там
как-то по другому ограничение считается, НО моё глубокое убеждение состоит в
том, что ТАКИЕ объёмы данных через COM вынимать не стоит ни в коем случае.

Кстати насчёт скорости разбора XML - тут оказывается огромное значение имеет
флаг "Preserve white space" - где-то это подробно обсуждалось, то-ли в FIDO,
то-ли тут, то-ли на foxclub.ru...

Posted via ActualForum NNTP Server 1.1

Игорь, привет.
Очень дельный совет, респект.
Igor Korolyovчто ТАКИЕ объёмы данных через COM вынимать не стоит ни в коем случае
Это понятно, но в начале темы я достаточно подробно описал суть задачи - хотца на бизнесс-уровне создать некий класс, на стороне клиента я должен создать объект данного класса с уже загруженной табличной частью...я понимаю, что можно создать в классе метод чтото типа "ИнициализоватьМеня", в котором на основания хэндла соединения будет подгружена табличная часть ну и так далее, который я и буду вызывать уже на стороне клиента, но пока не уверен в "чистоте" решения ....
...
Рейтинг: 0 / 0
Привести тип или вернуть курсор клиенту с удаленного COM-сервера
    #32900412
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi Dushes!

Я не понимаю, у тебя что "табличная часть" некоторого документа содержит
тысячи (и даже наверное сотни тысяч! чтоб такие объёмы вышли) записей? Или
ты всё-же "неправильно" с точки зрения клиент-сервера работаешь - вынимая
ВСЕ строки, а не только те что относятся к "текущему" документу?

Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
Привести тип или вернуть курсор клиенту с удаленного COM-сервера
    #32900629
Dushes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Igor Korolyov
Hi Dushes!
Я не понимаю, у тебя что "табличная часть" некоторого документа содержит
тысячи (и даже наверное сотни тысяч! чтоб такие объёмы вышли) записей? Или
ты всё-же "неправильно" с точки зрения клиент-сервера работаешь - вынимая
ВСЕ строки, а не только те что относятся к "текущему" документу?


Привет, Игорь.
понятно что с точки зрения клиент-серверной технологии неправильно тащить на сторону клиента большой объем данных, НО , если я пишу класс, он должен удовлетворять даже нештатным ситуациям - ну не хочется мне делать класс, который "вот так вот могу при таких условиях, а вот так даже пожалуй смогу" ;) - т.е. сразу на этапе проектирования интерфейса класса накладывать ограничения имхо некрасиво...поэтому условие что Igor Korolyov"табличная часть" некоторого документа содержит
тысячи (и даже наверное сотни тысяч! чтоб такие объёмы вышли) записей? должно быть тоже предусмотрено, как это не странно...

ps: вообщем, даже не знаю ка кдальше жить :(
...
Рейтинг: 0 / 0
Привести тип или вернуть курсор клиенту с удаленного COM-сервера
    #32905001
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi Dushes!

Ты наткнулся на ограничение по длинне строки передаваемой через COM?
Или ты всё-же опасаешься за производительность?
Если второе, то забей - если тупой клиент захотел получить свои 100000
записей - пускай сидит и ждёт - следующий раз он сначала подумает головой,
прежде чем такие условия отбора задавать (или НЕ задавать). Т.е. явно не
ограничивай, но и "оптимизировать" эту заведомо "неправильную" ветку не
стоит.
P.S. Даже если ты передашь ссылку на XMLAdapter, или другой объект а не на
"голый XML" - это никак не уменьшит объём прокачиваемых данных, а скорее
даже увеличит. Объект через COM НЕ передаётся, просто создаётся особого рода
"канал" (Proxy/Stub в случае "удалённого COM") по которому передаются
"вызовы методов", параметры и возвращаемые значения. В общем всё это есть в
специализированной литературе по COM...
P.P.S. Михаил Дроздов как-то рассказывал, что он "скрещивал" 3-х звенку с
2-х звенкой, т.е. к тем данным которые не нужно обрабатывать (тот-же
справочник или список чего-то) он обращался напрямую (через ODBC если это
реально SQL-сервер), а к тем что обрабатываются (чтобы получить курсор с
отчётом, чтобы внести изменения в данные и т.п.) - через промежуточный
слой - COM-сервер работающий на сервере (сорри за тафталогию - в смысле
компьютере-сервере).

Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
Привести тип или вернуть курсор клиенту с удаленного COM-сервера
    #32911596
Dushes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Hi...спасибо за ответ...

Igor Korolyov
Hi Dushes!

Ты наткнулся на ограничение по длинне строки передаваемой через COM?
Или ты всё-же опасаешься за производительность?
Если второе, то забей - если тупой клиент захотел получить свои 100000
записей - пускай сидит и ждёт - следующий раз он сначала подумает головой,
прежде чем такие условия отбора задавать (или НЕ задавать). Т.е. явно не
ограничивай, но и "оптимизировать" эту заведомо "неправильную" ветку не
стоит.
P.S. Даже если ты передашь ссылку на XMLAdapter, или другой объект а не на
"голый XML" - это никак не уменьшит объём прокачиваемых данных, а скорее
даже увеличит. Объект через COM НЕ передаётся, просто создаётся особого рода
"канал" (Proxy/Stub в случае "удалённого COM") по которому передаются
"вызовы методов", параметры и возвращаемые значения. В общем всё это есть в
специализированной литературе по COM...


да это все понятно...на ATL это все достаточно просто реализуется, конечно, требуются определенные знания по маршаллингу и пр., в том числе как ты и сказал, написание заглушки и прокси...а стандартно, что я могу получить, это COleVariant, который в фоксе мы видим как Object...блин, как жаль, что проект изначально не на .net, тут бы проблемы с серилизацией и передачи объекта на сторону клиента не было бы...а вот сейчас приходится голову ломать или вообще придется отказаться от идеологии трехзвенки...


P.P.S. Михаил Дроздов как-то рассказывал, что он "скрещивал" 3-х звенку с
2-х звенкой, т.е. к тем данным которые не нужно обрабатывать (тот-же
справочник или список чего-то) он обращался напрямую (через ODBC если это
реально SQL-сервер), а к тем что обрабатываются (чтобы получить курсор с
отчётом, чтобы внести изменения в данные и т.п.) - через промежуточный
слой - COM-сервер работающий на сервере (сорри за тафталогию - в смысле
компьютере-сервере).
Posted via ActualForum NNTP Server 1.1
ну разве что так...:(
...
Рейтинг: 0 / 0
Привести тип или вернуть курсор клиенту с удаленного COM-сервера
    #32912382
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотрите здесь:
тынц

может что и поможет...
...
Рейтинг: 0 / 0
Привести тип или вернуть курсор клиенту с удаленного COM-сервера
    #32913428
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi Dushes!

И всё-же я в упор не вижу о каких таких проблемах ты толкуешь :(
Фокс нормально передаёт и объекты (ссылки конечно) если тебе так удобнее -
работай с объектами (в 9-ке я глянул и коллекции нормально передаются, так
что и тут проблем быть не должно).

Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
26 сообщений из 26, показаны все 2 страниц
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Привести тип или вернуть курсор клиенту с удаленного COM-сервера
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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