عندما أرغب في الوصول إلى خدمة الويب المكتوبة بلغة C# من إجراء Oracle المخزن من خلال ملف dll خارجي (مكتوب بلغة دلفي)، تظهر عبارة "لم يتم استدعاء التهيئة بعد".
لا أعرف ما الذي يحدث، وآمل أن تعطيني بعض النصائح.
1. كتبت رقم الوظيفة في Oracle على النحو التالي:
إنشاء أو استبدال الدالة my.add (a in Binary_integer,b
في Binary_integer) قم بإرجاع Binary_integer كـ
المكتبة الخارجية my_lib
اسم إضافة رقم
اللغة ج؛
2. كتب عملية addtest على النحو التالي:
إنشاء أو استبدال الإجراء my.addtest (a in
ثنائي_عدد صحيح، ب في ثنائي_عدد صحيح)
مثل
retval Binary_integer؛
يبدأ
retval:=add(a,b);
نهاية؛
3. تم إنشاء الحزمة my_lib:
إنشاء مكتبة my_lib أو استبدالها كـ 'c:/Oracle/ora92/bin/mywebservice.dll'؛
4. قم بإنشاء mywebservice.dll في دلفي وانسخه إلى الدليل $Oracle_home$/bin هناك طريقة:
واجهة
الوظيفة addnumber(a:integer;b:integer):integer;cdecl;
....
تطبيق
الإجراء dogetwebserviceerr(errmsg:string);
فار
ملف السجل: ملف نصي؛
أنا: عدد صحيح؛
يبدأ
عيّن ملف(ملف السجل,'d:/test.txt');
يحاول
إعادة كتابة(ملف السجل);
write(logfile,errmsg);
أخيراً
ملف مغلق(ملف السجل);
نهاية؛
نهاية؛
الوظيفة addnumber(a:integer;b:integer):integer;
يبدأ
يحاول
النتيجة:= getmywebservicesoap().addnumber(a,b);
يستثني
على e: استثناء dogetwebserviceerr(eemessage);
آخر
النتيجة :=-1؛
نهاية؛
نهاية؛
.....
من بينها: getmywebservicesoap() هي طريقة في mywebservice.pas قمت باستيرادها باستخدام مستورد wsdl.
لقد قمت بتصدير هذه الطريقة في ملف المشروع الخاص بـ dll:
صادرات
addnumber;
5. استخدم C# لإنشاء خدمة ويب باسم mywebservice على المضيف المحلي. توجد طريقة ويب باسم addnumber، والتي تم تعريفها على النحو التالي:
[طريقة الويب]
رقم الإضافة العام (int a، int b)
{
العودة أ+ب؛
}
6. لقد قمت بكتابة عميل windows form بلغة c# واختبرت طريقة الويب عن طريق استدعاء ملف dll المكتوب بلغة دلفي أعلاه وكان الاختبار ناجحًا.
[dllimport(dllpath,entrypoint = mywebservice.dll, charset = charset.auto, communicationconvention = communicationconvention.stdcall)]
رقم إضافي ثابت خارجي خاص (int a,int b);
...
/// زر الاختبار
زر الفراغ الخاصtestwebservice_click(مرسل الكائن، system.eventargs e)
{
consle.write( addnumber(1,2));
}
7. فشل الاختبار في sql*plus عندما تم فتح ملف test.txt، كان المحتوى "لم يتم استدعاء التهيئة بعد".
تنفيذ addtest(1,1);
إذا قمت بتعديل addnumber في دلفي إلى
الوظيفة addnumber(a:integer;b:integer):integer;
يبدأ
يحاول
result :=a+b;// لا تتصل بخدمة الويب، احسب مباشرة
يستثني
على e: استثناء dogetwebserviceerr(eemessage);
آخر
النتيجة :=-1؛
نهاية؛
نهاية؛
التنفيذ ناجح.
تكوينات المستمع.ora وtnsnames.ora الخاصة بـ Oracle هي كما يلي
# ملف تكوين شبكة المستمع.ora: c:/Oracle/ora92/network/admin/listener.ora
# تم إنشاؤها بواسطة أدوات تكوين أوراكل.
my_extproc_listener =
(address_list =
(العنوان= (البروتوكول=IPC)
(المفتاح = اكستبروك)
)
)
sid_list_my_extproc_listener =
(sid_list =
(sid_desc =
(sid_name = extproc)
(Oracle_home = c:/Oracle/ora92)
(البرنامج = ج:/Oracle/ora92/bin/extproc)
(envs=extproc_dlls=any)
)
)
# ملف تكوين الشبكة tnsnames.ora: c:/Oracle/ora92/network/admin/tnsnames.ora
# تم إنشاؤها بواسطة أدوات تكوين أوراكل.
extproc_connection_data.world =
(الوصف =
(العنوان = (البروتوكول = IPC)(المفتاح = extproc))
(connect_data =
(سيد = اكستبروك)
)
)