เมื่อฉันต้องการเข้าถึงบริการเว็บที่เขียนด้วยภาษา C# จากขั้นตอนการจัดเก็บของ Oracle ผ่าน dll ภายนอก (เขียนด้วย Delphi) ข้อความ "ยังไม่ได้เรียกการสร้างเหรียญ" จะปรากฏขึ้น
ฉันไม่รู้ว่าเกิดอะไรขึ้น ฉันหวังว่าคุณจะช่วยแนะนำฉันได้บ้าง
1. ฉันเขียนฟังก์ชัน addnumber ใน Oracle ดังนี้:
สร้างหรือแทนที่ฟังก์ชัน my.add (a ใน binary_integer,b
ใน binary_integer) ให้คืนค่า binary_integer เป็น
ไลบรารีภายนอก my_lib
หมายเลขเพิ่มชื่อ
ภาษาค;
2. เขียนกระบวนการ addtest ดังนี้:
สร้างหรือแทนที่ขั้นตอน my.addtest (a in
binary_integer,b ใน binary_integer)
เช่น
retval binary_integer;
เริ่ม
retval:=เพิ่ม(ก,ข);
จบ;
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);
var
ไฟล์บันทึก: ไฟล์ข้อความ;
ฉัน:จำนวนเต็ม;
เริ่ม
มอบหมายไฟล์(logfile,'d:/test.txt');
พยายาม
เขียนใหม่ (ไฟล์บันทึก);
เขียน (ไฟล์บันทึก, errmsg);
ในที่สุด
closefile(ไฟล์บันทึก);
จบ;
จบ;
ฟังก์ชั่น addnumber(a:integer;b:integer):integer;
เริ่ม
พยายาม
ผลลัพธ์ := getmywebservicesoap().addnumber(a,b);
ยกเว้น
บน e: ข้อยกเว้น dogetwebserviceerr (eemessage);
อื่น
ผลลัพธ์ :=-1;
จบ;
จบ;
-
ในหมู่พวกเขา: getmywebservicesoap() เป็นวิธีการใน mywebservice.pas ที่ฉันนำเข้าโดยใช้ wsdl importer
ฉันส่งออกวิธีนี้ในไฟล์โครงการของ dll:
การส่งออก
เพิ่มหมายเลข;
5. ใช้ C# เพื่อสร้างบริการเว็บชื่อ mywebservice บน localhost มีวิธีการเว็บชื่อ addnumber ซึ่งกำหนดไว้ดังนี้:
[วิธีการทางเว็บ]
สาธารณะ int addnumber (int a, int b)
-
กลับ+b;
-
6. ฉันเขียนไคลเอนต์แบบฟอร์ม windows ใน c# และทดสอบวิธีการทางเว็บโดยการเรียก dll ที่เขียนด้วย delphi ด้านบน การทดสอบสำเร็จ
[dllimport(dllpath,entrypoint = mywebservice.dll, charset = charset.auto,callingconvention =callingconvention.stdcall)]
addnumber int คงที่ภายนอกส่วนตัว (int a, int b);
-
/// ปุ่มทดสอบ
ปุ่มโมฆะส่วนตัวtestwebservice_click (ผู้ส่งวัตถุ system.eventargs e)
-
consle.write( เพิ่มหมายเลข(1,2));
-
7. การทดสอบล้มเหลวใน sql*plus เมื่อเปิดไฟล์ test.txt เนื้อหาคือ "ยังไม่ได้เรียกการสร้างเหรียญ" รหัสทดสอบมีดังนี้
ดำเนินการ addtest (1,1);
หากคุณแก้ไข addnumber ใน delphi เป็น
ฟังก์ชั่น addnumber(a:integer;b:integer):integer;
เริ่ม
พยายาม
result :=a+b;//อย่าเรียก webservice คำนวณโดยตรง
ยกเว้น
บน e: ข้อยกเว้น dogetwebserviceerr (eemessage);
อื่น
ผลลัพธ์ :=-1;
จบ;
จบ;
การดำเนินการประสบความสำเร็จ
การกำหนดค่าของ Listener.ora และ 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)
-
-