Ketika saya ingin mengakses layanan web yang ditulis dalam C# dari prosedur tersimpan Oracle melalui dll eksternal (ditulis dalam Delphi), "coinitialize belum dipanggil" muncul.
Saya tidak tahu apa yang terjadi, saya harap Anda dapat memberi saya nasihat.
1. Saya menulis fungsi addnumber di Oracle sebagai berikut:
membuat atau mengganti fungsi my.add (a dalam biner_integer,b
dalam biner_integer) kembalikan biner_integer sebagai
perpustakaan eksternal my_lib
nama nomor tambahan
bahasa c;
2. Menulis proses addtest sebagai berikut:
membuat atau mengganti prosedur my.addtest (a in
biner_integer,b dalam biner_integer)
sebagai
retval biner_integer;
mulai
retval:=tambahkan(a,b);
akhir;
3. Membuat paket my_lib:
buat atau ganti perpustakaan my_lib sebagai 'c:/Oracle/ora92/bin/mywebservice.dll';
4. Buat mywebservice.dll di Delphi dan salin ke direktori $Oracle_home$/bin Ada metodenya:
antarmuka
fungsi nomor tambahan(a:integer;b:integer):integer;cdecl;
....
pelaksanaan
prosedur dogetwebserviceerr(errmsg:string);
var
file log: file teks;
saya: bilangan bulat;
mulai
tugaskanfile(file log,'d:/test.txt');
mencoba
menulis ulang (file log);
tulis(file log,errmsg);
Akhirnya
closefile(file log);
akhir;
akhir;
fungsi nomor tambahan(a:integer;b:integer):integer;
mulai
mencoba
hasil := getmywebservicesoap().addnumber(a,b);
kecuali
di e: pengecualian dogetwebserviceerr(eemessage);
kalau tidak
hasil :=-1;
akhir;
akhir;
.....
Diantaranya: getmywebservicesoap() adalah metode di mywebservice.pas yang saya impor menggunakan wsdl importer.
Saya mengekspor metode ini ke file proyek dll:
ekspor
tambahkan nomor;
5. Gunakan C# untuk membuat layanan web bernama mywebservice di localhost. Ada metode web bernama addnumber, yang didefinisikan sebagai berikut:
[metode web]
nomor tambahan int publik(int a,int b)
{
kembalikan a+b;
}
6. Saya menulis klien formulir windows di c# dan menguji metode web dengan memanggil dll yang ditulis dalam delphi di atas. Tes berhasil.
[dllimport(dllpath,entrypoint = mywebservice.dll, charset = charset.auto, callconvention = callconvention.stdcall)]
nomor tambahan int statis eksternal pribadi (int a,int b);
...
///Tombol tes
private void buttontestwebservice_click(pengirim objek, system.eventargs e)
{
consle.write(tambah nomor(1,2));
}
7. Tes gagal di sql*plus. Saat file test.txt dibuka, isinya "coinitialize belum dipanggil".
jalankan tes tambahan(1,1);
Jika Anda mengubah addnumber di delphi menjadi
fungsi nomor tambahan(a:integer;b:integer):integer;
mulai
mencoba
hasil :=a+b;//Jangan panggil webservice, hitung langsung
kecuali
di e: pengecualian dogetwebserviceerr(eemessage);
kalau tidak
hasil :=-1;
akhir;
akhir;
Eksekusi berhasil.
Konfigurasi pendengar.ora dan tnsnames.ora Oracle adalah sebagai berikut
# file konfigurasi jaringan pendengar.ora: c:/Oracle/ora92/network/admin/listener.ora
# dihasilkan oleh alat konfigurasi Oracle.
my_extproc_listener =
(daftar_alamat =
(alamat= (protokol=ipc)
(kunci = extproc)
)
)
sid_list_my_extproc_listener =
(daftar_sid =
(sid_desc =
(sid_name = extproc)
(Oracle_home = c:/Oracle/ora92)
(program= c:/Oracle/ora92/bin/extproc)
(envs=extproc_dlls=apa saja)
)
)
# file konfigurasi jaringan tnsnames.ora: c:/Oracle/ora92/network/admin/tnsnames.ora
# dihasilkan oleh alat konfigurasi Oracle.
extproc_connection_data.world =
(deskripsi =
(alamat = (protokol = ipc)(kunci = extproc))
(sambungkan_data =
(sid = extproc)
)
)