日期:2010-04-26  浏览次数:20383 次

我想从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)
)
)