Когда я хочу получить доступ к веб-сервису, написанному на C#, из хранимой процедуры Oracle через внешнюю dll (написанную на Delphi), появляется сообщение «coinitialize еще не вызывалось».
Я не знаю, что происходит, надеюсь, вы дадите мне совет.
1. Я написал функцию addnumber в Oracle следующим образом:
создать или заменить функцию my.add (a вbinary_integer,b
в двоичном_целом) верните двоичный_цело как
внешняя библиотека my_lib
имя, дополнительный номер
язык с;
2. Написал аддтест процесса следующим образом:
создать или заменить процедуру my.addtest (в
двоичный_целый,b в двоичном_целом)
как
retvalbinary_integer;
начинать
ретвал: = добавить (а, б);
конец;
3. Создал пакет my_lib:
создайте или замените библиотеку my_lib как «c:/oracle/ora92/bin/mywebservice.dll»;
4. Создайте mywebservice.dll в Delphi и скопируйте его в каталог $oracle_home$/bin. Есть способ:
интерфейс
функция addnumber(a:integer;b:integer):integer;cdecl;
....
выполнение
процедура dogetwebserviceerr(errmsg:string);
вар
файл журнала: текстовый файл;
я: целое число;
начинать
Assignfile(файл журнала,'d:/test.txt');
пытаться
переписать (файл журнала);
запись (файл журнала, errmsg);
окончательно
закрыть файл (файл журнала);
конец;
конец;
функция addnumber(a:integer;b:integer):integer;
начинать
пытаться
результат: = getmywebservicesoap().addnumber(a,b);
кроме
на e: исключение dogetwebserviceerr(eemessage);
еще
результат :=-1;
конец;
конец;
.....
Среди них: getmywebservicesoap() — это метод в mywebservice.pas, который я импортировал с помощью средства импорта wsdl.
Я экспортировал этот метод в файл проекта dll:
экспорт
добавить номер;
5. Используйте C# для создания веб-службы с именем mywebservice на локальном хосте. Существует веб-метод с именем addnumber, который определяется следующим образом:
[веб-метод]
public int addnumber(int a,int b)
{
вернуть а+б;
}
6. Я написал клиент формы Windows на C# и протестировал веб-метод, вызвав DLL, написанную на Delphi выше. Тест прошел успешно.
[dllimport(dllpath,entrypoint = mywebservice.dll, charset = charset.auto, CallingConvention = CallingConvention.stdcall)]
частный extern static int addnumber(int a,int b);
...
///Кнопка тестирования
частная пустота buttontestwebservice_click (отправитель объекта, system.eventargs e)
{
consle.write(addnumber(1,2));
}
7. Тест в sql*plus не пройден. При открытии файла test.txt содержимое было «coinitialize еще не была вызвана». Тестовый код выглядит следующим образом.
выполнить addtest(1,1);
Если вы измените addnumber в Delphi на
функция addnumber(a:integer;b:integer):integer;
начинать
пытаться
result :=a+b;//Не вызывать веб-сервис, вычислять напрямую
кроме
на e: исключение dogetwebserviceerr(eemessage);
еще
результат :=-1;
конец;
конец;
Исполнение успешное.
Конфигурации прослушивателей oracle и tnsnames.ora oracle следующие:
# файл конфигурации сети Listener.ora: c:/oracle/ora92/network/admin/listener.ora
# создано инструментами настройки Oracle.
my_extproc_listener =
(список_адресов =
(адрес= (протокол=ipc)
(ключ = extproc)
)
)
sid_list_my_extproc_listener =
(sid_list =
(sid_desc =
(sid_name = extproc)
(oracle_home = c:/oracle/ora92)
(программа = c:/oracle/ora92/bin/extproc)
(envs=extproc_dlls=любой)
)
)
# Файл конфигурации сети tnsnames.ora: c:/oracle/ora92/network/admin/tnsnames.ora
# создано инструментами настройки Oracle.
extproc_connection_data.world =
(описание =
(адрес = (протокол = ipc) (ключ = extproc))
(connect_data =
(sid = extproc)
)
)