|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
如果需要重新编写代码,几乎任何一门计算机语言都可以跨平台了,还用得着Java嘛,而且像PHP/C#等语言不需要修改代码都可以跨Windows/Linux。web|会见|成绩我想从Oracle的存储历程经由过程一个内部dll(Delphi编写)往会见C#写的WebService时,呈现了“还没有挪用CoInitialize”
不晓得是怎样回事,看列位指导一二。
1、我在Oracle里写了一个函数AddNumber以下:
CREATEORREPLACEFUNCTION"MY"."ADD"(ainBINARY_INTEGER,b
inBINARY_INTEGER)RETURNBINARY_INTEGERAS
EXTERNALLIBRARYMY_LIB
NAME"AddNumber"
LANGUAGEC;
2、写了一个历程AddTest以下:
CREATEORREPLACEPROCEDURE"MY"."ADDTEST"(ain
BINARY_INTEGER,binBINARY_INTEGER)
as
retValBINARY_INTEGER;
begin
retVal:=Add(a,b);
end;
3、创立了MY_LIB包:
CREATEORREPLACELIBRARYMY_LIBASC:oracleora92inMyWebservice.dll;
4、在Delphi里创立了一个MyWebservice.dll,并拷贝其到$ORACLE_HOME$BIN目次下,个中有一个办法:
interface
functionAddNumber(a:integer;b:integer):Integer;cdecl;
....
implementation
procedureDoGetWebServiceErr(ErrMsg:string);
var
logFile:TextFile;
i:integer;
begin
AssignFile(logFile,d: est.txt);
try
Rewrite(logFile);
Write(logFile,ErrMsg);
finally
CloseFile(logFile);
end;
end;
functionAddNumber(a:integer;b:integer):Integer;
begin
try
Result:=GetMyWebServiceSoap().AddNumber(a,b);
except
onE:ExceptiondoDoGetWebServiceErr(E.E.Message);
else
Result:=-1;
end;
end;
.....
个中:GetMyWebServiceSoap()是我用WSDLImporter导进天生的MyWebService.pas中的一个办法。
我在该Dll的项目文件里导出了该办法:
exports
AddNumber;
5、用C#在Localhost创立了一个名为MyWebService的WebService,个中有一个名为AddNumber的WEB办法,其界说以下:
[WebMethod]
publicintAddNumber(inta,intb)
{
returna+b;
}
6、我用c#写了一个WindowsForm客户端,经由过程挪用下面用Delphi写的dll,测试该Web办法,测试乐成
[DllImport(DLLPath,EntryPoint="MyWebservice.dll",CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall)]
privateexternstaticintAddNumber(inta,intb);
......
///测试按钮
privatevoidbuttonTestWebService_Click(objectsender,System.EventArgse)
{
Consle.Write(AddNumber(1,2));
}
7、在SQL*Plus里测试失利,翻开Test.txt文件内容为“还没有挪用CoInitialize”,测试代码以下
EXECUTEAddtest(1,1);
假如将Delphi中的AddNumber修正为
functionAddNumber(a:integer;b:integer):Integer;
begin
try
Result:=a+b;//不挪用WebService,间接盘算
except
onE:ExceptiondoDoGetWebServiceErr(E.E.Message);
else
Result:=-1;
end;
end;
实行则乐成。
Oracle的Listener.ora和tnsnames.ora的设置以下
#LISTENER.ORANetworkConfigurationFile:C:oracleora92
etworkadminlistener.ora
#GeneratedbyOracleconfigurationtools.
MY_EXTPROC_LISTENER=
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=ipc)
(KEY=extproc)
)
)
SID_LIST_MY_EXTPROC_LISTENER=
(SID_LIST=
(SID_DESC=
(SID_NAME=extproc)
(ORACLE_HOME=C:oracleora92)
(PROGRAM=C:oracleora92inextproc)
(ENVS="EXTPROC_DLLS=ANY")
)
)
#TNSNAMES.ORANetworkConfigurationFile:C:oracleora92
etworkadmin nsnames.ora
#GeneratedbyOracleconfigurationtools.
EXTPROC_CONNECTION_DATA.WORLD=
(DESCRIPTION=
(ADDRESS=(PROTOCOL=IPC)(KEY=extproc))
(CONNECT_DATA=
(SID=extproc)
)
)
C#中有两处地方用到new关键字,第一处也是最常见的一处是用在调用构造函数的时候,这种情况也是大家见的最多的一种。另一处是用在派生类中,作用有隐藏成员,切断继承关系等,相信第二处的用法大家明显要比第一处生疏。 |
|