Lorsque je souhaite accéder au service Web écrit en C# à partir de la procédure stockée d'Oracle via une DLL externe (écrite en Delphi), "coinitialize n'a pas encore été appelé" apparaît.
Je ne sais pas ce qui se passe, j'espère que vous pourrez me donner quelques conseils.
1. J'ai écrit une fonction addnumber dans Oracle comme suit :
créer ou remplacer la fonction my.add (a en binaire_entier,b
en binaire_entier) renvoie binaire_entier comme
bibliothèque externe my_lib
nom ajouter un numéro
langue c;
2. J'ai écrit un test d'ajout de processus comme suit :
créer ou remplacer la procédure my.addtest (a dans
entier_binaire,b dans entier_binaire)
comme
récupération binaire_entier ;
commencer
retval:=ajouter(a,b);
fin;
3. Création du package my_lib :
créer ou remplacer la bibliothèque my_lib par 'c:/oracle/ora92/bin/mywebservice.dll' ;
4. Créez un mywebservice.dll dans Delphi et copiez-le dans le répertoire $oracle_home$/bin. Il existe une méthode :
interface
function addnumber(a:entier;b:entier):entier;cdecl;
....
mise en œuvre
procédure dogetwebserviceerr(errmsg:string);
var
fichier journal : fichier texte ;
je:entier;
commencer
assignfile(logfile,'d:/test.txt');
essayer
réécrire (fichier journal);
écrire (fichier journal, errmsg);
enfin
closefile (fichier journal);
fin;
fin;
function addnumber(a:entier;b:entier):entier;
commencer
essayer
résultat := getmywebservicesoap().addnumber(a,b);
sauf
sur e : exception do dogetwebserviceerr(eemessage);
autre
résultat :=-1;
fin;
fin;
.....
Parmi eux : getmywebservicesoap() est une méthode dans mywebservice.pas que j'ai importée à l'aide de l'importateur wsdl.
J'ai exporté cette méthode dans le fichier projet de la dll :
exportations
ajouter un numéro ;
5. Utilisez C# pour créer un service Web nommé mywebservice sur localhost. Il existe une méthode Web nommée addnumber, qui est définie comme suit :
[méthode Web]
public int addnumber (int a, int b)
{
retourner a+b ;
}
6. J'ai écrit un client Windows Form en C# et testé la méthode Web en appelant la DLL écrite en Delphi ci-dessus. Le test a réussi.
[dllimport (chemin dll, point d'entrée = monserviceweb.dll, charset = charset.auto, convention d'appel = convention d'appel.stdcall)]
private extern static int addnumber (int a, int b);
...
///Bouton Tester
bouton d'annulation privétestwebservice_click (expéditeur d'objet, system.eventargs e)
{
consle.write( addnumber(1,2));
}
7. Le test a échoué dans sql*plus Lorsque le fichier test.txt a été ouvert, le contenu était « coinitialize n'a pas encore été appelé ». Le code du test est le suivant.
exécuter addtest(1,1);
Si vous modifiez addnumber dans Delphi pour
function addnumber(a:entier;b:entier):entier;
commencer
essayer
résultat :=a+b;//Ne pas appeler le webservice, calculer directement
sauf
sur e : exception do dogetwebserviceerr(eemessage);
autre
résultat :=-1;
fin;
fin;
L'exécution est réussie.
Les configurations de Listener.ora et tnsnames.ora d'Oracle sont les suivantes
# fichier de configuration réseau Listener.ora : c:/oracle/ora92/network/admin/listener.ora
# généré par les outils de configuration Oracle.
mon_extproc_listener =
(liste_adresses =
(adresse= (protocole=ipc)
(clé = extrait)
)
)
sid_list_my_extproc_listener =
(liste_sid =
(sid_desc =
(nom_sid = extproc)
(oracle_home = c:/oracle/ora92)
(programme = c:/oracle/ora92/bin/extproc)
(envs=extproc_dlls=any)
)
)
# Fichier de configuration réseau tnsnames.ora : c:/oracle/ora92/network/admin/tnsnames.ora
# généré par les outils de configuration Oracle.
extproc_connection_data.world =
(description =
(adresse = (protocole = ipc)(clé = extproc))
(connect_data =
(sid = extrait)
)
)