![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ошибки при передаче параметров типа 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.