程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> Oralce 調用Delphi寫DLL去訪問C# WebService的問題

Oralce 調用Delphi寫DLL去訪問C# WebService的問題

編輯:.NET實例教程

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved