Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Ошибки при передаче параметров типа sequence


BERK ©   (2002-12-29 18:33:00) 

Народ, поделитесь с новичком решением следующей проблемы:

Есть IDL-объявление:
typedef sequence<octet> DataPacket;
interface MyInterface {
long HandleQuery(in string SQLquery, out DataPacket Data);
                     };

Хочу через функцию данного интерфейса задать CORBA-объекту SQL-запрос,
далее на сервере приложений его выполнить, результат записать в ClientDataSet и передать через переменную Data клиенту (он естественно, перепишет данный в "свой" ClientDataSet, и отобразит, например в Grid-e).

В клиенте, после инициализации ORB, получения объектной ссылки и т.п., пытаюсь выполнить метод:

const char* SQLquery="select * from company";
DataPacket_var Data;

if (CORBA::is_nil(oRef))//Если IOR не связана с CORBA-объектом, то
 ShowMessage("Failure during getting of object reference");
 else  oRef->HandleQuery(SQLquery, Data);// Вызвать метод

Выдает ошибку "CORBA::BAD_PARAM".
В серванте, в коде метода  HandleQuery, переменной Data ничего не присваиваю, т.е. пока только тестирую, доходит ли запрос до сервера и обратно, или нет.

PS: Пишу на CBuilder6. Да, и если кого-нибудь заинтересует данный вопрос, еще одна просьба - нет ли у кого компакта с примерами из книги Цимбала (Технология CORBA)и вообще примерами (с комментариями кода на русском? ;-). Очень бы хотелось их получить (книгу достал, а СД по дороге кто-то стырил ;-)


BERK   (2003-01-03 13:41:00) [1]

Спасибо всем ;-) Уже всё получилось!

Оказывается, проблема была в том, что я пытался тестировать выполнение метода без присваивания значения out-параметру.
Правильный вариант, например, следующий:

CORBA::Long MyInterfaceImpl::HandleQuery(const char* SQLquery, DataPacket_out Data) throw(CORBA::SystemException)
{
//Sleep(1000);
//Обработка запроса клиента
MainFormServer->lbMessages->Items->Add(SQLquery);

Data = new DataPacket;

Data.ptr()->length(2);
Data[0]='A';
Data[1]='B';

return 0;       //Возврат 0 - успешное выполненение процедуры
}


Помог, как всегда, метод RTFM&STFW + наличие рядом более опытного товарища ;-)
Тот же товарищ подсказал, что лучше результат SQL-запроса записывать в переменную типа VARIANT, а передавать через Any (надо подключить файл Any2Variant.h,*.cpp)


BERK   (2002-12-30 20:26:00) [2]

excep->_name() = CORBA::BAD_PARAM
excep->minor() = 1330446336
excep->completed() = 1

minor=1330446336dec=4F4D0000hex=1001111010011010000000000000000bin.

Это какой код? 19 (10011bin)или другой?

А может просто кусок работающего кода с неограниченными последовательностями дадите? ;-)
А вообще супер, если в эту последовательность записывается файл MyClientDataSet->SaveToFile("Data.xml", dfXML)) ;-)))

PS: Книга Цимбала, стр. 173 у меня перед глазами, но не помогает ;-)


epflorov   (2002-12-29 20:04:00) [3]

Там может быть 32 разных младших кодов в исключении. Какой у тебя?

Перевод главы 4 спецификации CORBA v 2.61 стр. 4-47 (перевода :) )

BAD_PARAM
1 Отказ в регистрации, unregister, или lookup фабрики значения.
2 RID уже определен в IFR.
3 Имя уже используется в контексте в IFR.
4 Цель не является допустимым (правильным) контейнером.
5 Конфликт имен в унаследованном контексте.
6 Некорректный тип для абстрактного интерфейса.
7 преобразование string_to_object потерпело неудачу вследствие плохогоscheme name.
8 преобразование потерпело неудачу вследствие плохого адреса.
9 преобразование потерпело неудачу вследствие плохого bad schema
specific part.
10 преобразование потерпело неудачу вследствие не определенной
причины.
11 Попытка унаследовать абстрактный интерфейс от неабстрактного
базового интерфейса в Хранилище Интерфейсов.
12 Попытка позволить ValueDef поддержать более одного неабстрактного интерфейса в Хранилище Интерфейсов.
13 Попытка использовать дефектный TypeCode как параметр.
14 Недопустимый id объекта передается в POA::create_reference_by_id.
15 Плохой аргумент name в TypeCode операции.
16 Плохой RepositoryId аргумент в TypeCode операции.
17 недопустимое имя члена в TypeCode операции.
18 Двойное значение метки в create_union_tc.
19 Несовместимый TypeCode метки и discriminator в create_union_tc.
20 Supplied discriminator type illegitimate in create_union_tc.
21 Нечто переданное в ServerRequest::set_exception не содержит
исключение.
22 Не перечисленное пользовательское исключение передается в
ServerRequest::set_exception.
23 wchar transmission code set not in service context.
24 сервисный контекст не находится в определенном OMG диапазоне.
25 Значение перечисления вне диапазона.
26 Недопустимый Id сервисного контекста в переносимом перехватчике(portable interceptor)
27 Попытка вызвать register_initial_reference с null Object
28 Недопустимый Id компонента в переносимом перехватчике (portable interceptor)
29 Недопустимы profile Id в переносимом перехватчике (portable
interceptor)
30 Два или более объектов Policy с одним и тем же значением PolicyType поданы в Object::set_policy_overrides или
PolicyManager::set_policy_overrides.
31 Попытка определить однонаправленную (oneway) операцию с не-void результатом, out или inout параметрами или пользовательскими исключениям.
32 DII asked to create request for an implicit operation.


Наверх

Титульная страница Поиск, карта сайта Написать письмо