html5中文学习网

您的位置: 首页 > 网络编程 > ASP.NET » 正文

Oralce 调用Delphi写DLL去访问C# WebService的问题_.NET教程_编程技术

[ ] 已经帮助:人解决问题
web|访问|问题
我想从Oracle的存储过程通过一个外部dll(Delphi编写)去访问C#写的WebService时,出现了“尚未调用 CoInitialize”
不知道是怎么回事,望各位指点一二。
1、我在Oracle里写了一个函数AddNumber如下:
CREATE OR REPLACE FUNCTION "MY"."ADD" (a in BINARY_INTEGER,b
in BINARY_INTEGER) RETURN BINARY_INTEGER AS
EXTERNAL LIBRARY MY_LIB
NAME "AddNumber"
LANGUAGE C;
2、写了一个过程AddTest如下:
CREATE OR REPLACE PROCEDURE "MY"."ADDTEST" (a in
BINARY_INTEGER,b in BINARY_INTEGER)
as
retVal BINARY_INTEGER;
begin
retVal:=Add(a,b);
end;
3、创建了MY_LIB包:
CREATE OR REPLACE LIBRARY MY_LIB AS 'C:/oracle/ora92/bin/MyWebservice.dll';
4、在Delphi里创建了一个MyWebservice.dll,并拷贝其到$ORACLE_HOME$/BIN目录下,其中有一个方法:
interface
function AddNumber(a:integer;b:integer):Integer;cdecl;
....
implementation
procedure DoGetWebServiceErr(ErrMsg:string);
var
logFile: TextFile;
i:integer;
begin
AssignFile(logFile,'d:/test.txt');
try
Rewrite(logFile);
Write(logFile,ErrMsg);
finally
CloseFile(logFile);
end;
end;
function AddNumber(a:integer;b:integer):Integer;
begin
try
Result := GetMyWebServiceSoap().AddNumber(a,b);
except
on E: Exception do DoGetWebServiceErr(E. E.Message);
else
Result :=-1;
end;
end;
.....
其中:GetMyWebServiceSoap()是我用WSDL Importer导入生成的MyWebService.pas中的一个方法。
我在该Dll的项目文件里导出了该方法:
exports
AddNumber;
5、用C#在Localhost创建了一个名为MyWebService的Web Service,其中有一个名为AddNumber的WEB方法,其定义如下:
[WebMethod]
public int AddNumber(int a,int b)
{
return a+b;
}
6、我用c#写了一个Windows Form客户端,通过调用上面用Delphi 写的dll,测试该Web方法,测试成功
[DllImport(DLLPath,EntryPoint = "MyWebservice.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
private extern static int AddNumber(int a,int b);
......
///测试按钮
private void buttonTestWebService_Click(object sender, System.EventArgs e)
{
Consle.Write( AddNumber(1,2));
}
7、在SQL*Plus里测试失败,打开Test.txt文件内容为“尚未调用 CoInitialize”,测试代码如下
EXECUTE Addtest(1,1);
如果将Delphi中的AddNumber 修改为
function AddNumber(a:integer;b:integer):Integer;
begin
try
Result :=a+b;//不调用WebService,直接计算
except
on E: Exception do DoGetWebServiceErr(E. E.Message);
else
Result :=-1;
end;
end;
执行则成功。
Oracle的Listener.ora和tnsnames.ora的配置如下
# LISTENER.ORA Network Configuration File: C:/oracle/ora92/network/admin/listener.ora
# Generated by Oracle configuration tools.
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:/oracle/ora92)
(PROGRAM= C:/oracle/ora92/bin/extproc)
(ENVS="EXTPROC_DLLS=ANY")
)
)
# TNSNAMES.ORA Network Configuration File: C:/oracle/ora92/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.

EXTPROC_CONNECTION_DATA.WORLD =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = extproc))
(CONNECT_DATA =
(SID = extproc)
)
)


kZcHTML5中文学习网 - HTML5先行者学习网
kZcHTML5中文学习网 - HTML5先行者学习网
(责任编辑:)
推荐书籍
推荐资讯
关于HTML5先行者 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 人才招聘 - 帮助