IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB 6 et antérieur Discussion :

[ADO]Exécuter une procédure stockée Oracle


Sujet :

VB 6 et antérieur

  1. #1
    Membre expérimenté
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 219
    Points : 1 438
    Points
    1 438
    Par défaut [ADO]Exécuter une procédure stockée Oracle
    Bonjour,

    J'ai un problème de no data found lorsque je tente d'exécuter une commande ADO "adCmdStoredProc". Voici le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    Option Explicit
    Dim con As New ADODB.Connection
    Dim rs As New ADODB.Recordset
    Dim cmd As ADODB.Command
    Dim str_empid, strconnect As String
     
    Private Sub cmd_get_Click()
     
        str_empid = txt_empid.Text
     
        Set cmd = New ADODB.Command
        cmd.ActiveConnection = con
        cmd.CommandType = adCmdStoredProc
        cmd.CommandText = "rand.empdetails"
    cmd.Parameters.Refresh
     
        cmd.Parameters.Append cmd.CreateParameter("v_empid", adVarChar, adParamInput, 6, str_empid)
     
        Set rs = cmd.Execute
     
        If Not rs.EOF Then
            txt_firstname = rs.Fields(0)
            txt_title = rs.Fields(1)
            txt_address = rs.Fields(2)
        End If
     
        Set cmd.ActiveConnection = Nothing
     
    End Sub
     
    Private Sub Form_Load()
        strconnect = "Provider=OraOLEDB.Oracle.1;Password=jklm;Persist Security Info=True;User ID=system;Data Source=rand_db"
        con.Open strconnect, "", ""
    End Sub
    Or l'équivalent SQL Server marche très bien. Je précise que la connexion (con.Open) s'effectue avec succès.
    Voici également les requêtes de création des trucs de la BD:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    create table RAND.EMPLOYEES(
    	"ID" int ,
    	FirstName varchar2(20),
    	Title varchar2(20),
    	Address varchar2(20),
    	CONSTRAINT "PK_EMPL0YEES" PRIMARY KEY(ID) 
    	USING INDEX TABLESPACE RANDINDEX
    	)TABLESPACE RANDDATA 
    	LOGGING;
     
    CREATE OR REPLACE procedure RAND.empdetails(v_empid int)
    AS
    v_FN varchar2(20);
    v_Title varchar2(20);
    v_Addr varchar2(20);
    BEGIN
    SELECT FirstName, Title, Address INTO v_FN, v_Title, v_Addr FROM Employees WHERE ID = v_empid;
    END;
    Par curiosité : que dois-je utiliser ? le provider de Microsoft ou celui d'Oracle ?

  2. #2
    Membre expérimenté
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 219
    Points : 1 438
    Points
    1 438
    Par défaut
    Il semble donc que l'exécution d'une procédure sous Oracle n'est pas semblable à celle de SQL Server !! (c-à-d capable de retourner un recordset)
    Je modifie alors la procédure "RAND.empdetails" elle-même en ajoutant 3 paramètres OUTPUT !!! Mais je sais pas comment faire avec le code VB : capturer les valeurs retournées ??

  3. #3
    Membre expérimenté
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 219
    Points : 1 438
    Points
    1 438
    Par défaut
    Le problème de "no data found" (je remarque qu'il y a des données dans la table) n'est pas assez grave mais celui de "cmd.Parameters.Refresh" l'est: lorsque le provider est celui d'Oracle, il y a erreur sur cette ligne
    PLS-00306: wrong number or types of arguments in call to 'EMPDETAILS'

    Et ben, après, si on déplace cmd.Parameters.Refresh après CreateParameter, l'erreur se produit quand le provider est Microsoft et tout est Ok lorsque le provider est d'Oracle

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Private Sub cmd_get_Click()
    Dim i As Integer
     
        str_empid = txt_empid.Text
     
        Set cmd = New ADODB.Command
        cmd.ActiveConnection = con
        cmd.CommandType = adCmdStoredProc
        cmd.CommandText = "RAND.EMPDETAILS"
     
        cmd.Parameters.Append cmd.CreateParameter("v_empid", adVarChar, adParamInput, 6, str_empid)
        cmd.Parameters.Refresh
     
        Set rs = cmd.Execute

  4. #4
    Membre expérimenté
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 219
    Points : 1 438
    Points
    1 438
    Par défaut
    Le problème de "no data found" (je remarque qu'il y a des données dans la table)
    Bon, c'est mon erreur, il n'y avait pas de commit !!

    Je modifie alors la procédure "RAND.empdetails" elle-même en ajoutant 3 paramètres OUTPUT !!! Mais je sais pas comment faire avec le code VB : capturer les valeurs retournées ??
    Je ne l'ai pas posté mais c'est un truc de CreateParameter() seulement en VB et ça marche !!

    Et ben, après, si on déplace cmd.Parameters.Refresh après CreateParameter, l'erreur se produit quand le provider est Microsoft et tout est Ok lorsque le provider est d'Oracle
    C'est encore confirmé avec la modification suivante qui rend le code plus clair, d'abord la procédure stockée (ajout d'un paramètre OUTPUT):
    (v_empid int, v_result out varchar2)
    AS
    BEGIN
    SELECT FirstName INTO v_result FROM Employees WHERE ID = v_empid;
    END;

    et le code VB:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    Private Sub cmd_get_Click()
    Dim intRoyalty As Integer
     
        str_empid = txt_empid.Text
     
        Set cmd = New ADODB.Command
        cmd.ActiveConnection = con
        cmd.CommandText = "rand.empdetails"
        cmd.CommandType = adCmdStoredProc
        cmd.Parameters.Refresh
        MsgBox "Nombre de param = " & cmd.Parameters.Count
     
        intRoyalty = Trim(str_empid)
     
        cmd.Parameters(0).Value = intRoyalty        
     
        cmd.Execute
     
        txt_firstname = cmd.Parameters(1).Value    
     
        Set cmd.ActiveConnection = Nothing
     
    End Sub
    Pas de problème avec le provider Microsoft mais ERREUR SUR "cmd.Parameters.Refresh" AVEC CELUI D'ORACLE:
    Le fournisseur ne peut pas obtenir les infos de paramètres et SetParameterInfo n'a pas été appelé

    Je ne comprend pas

  5. #5
    Membre expérimenté
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 219
    Points : 1 438
    Points
    1 438
    Par défaut
    De Vicenzo

    Bon, j'ai a tout hasard vérifié sur METALINK, et j'ai trouvé un papier stipulant que c'est un bug connu car Oracle a décidé de ne pas supporter cette propriété ADO.

    Bon, je te fais un copier/coller ici de la note metalink :

    Citation:

    Subject: Using .Parameters.Refresh method fails with runtime error -2147217839 (80040e51)
    Doc ID: Note:267370.1
    Type: PROBLEM
    Last Revision
    Date: 03-NOV-2006
    Status: PUBLISHED

    Problem Description
    -------------------
    With the Oracle OLEDB provider 9.2.0.2.0 or higher,
    Using Visual Basic, you would like to return a list of the parameters for a
    stored procedure.

    Here, under a sample code :

    Private Sub Command1_Click()
    On Error GoTo err:
    Dim ConnString As String
    Dim Conn As ADODB.Connection
    Dim cmd As ADODB.Command
    Dim Params As ADODB.Parameters
    Dim Param As ADODB.Parameter

    sConnString = "Provider=OraOLEDB.Oracle;User ID=username;Password=password;Data Source=Data_Source;PLSQLRSet=1;"
    Set Conn = New ADODB.Connection
    Set cmd = New ADODB.Command
    Conn.open sConnString
    cmd.ActiveConnection = Conn
    cmd.CommandText = "pkg.proc"
    cmd.CommandType = adCmdStoredProc
    cmd.Parameters.Refresh
    Set Params = cmd.Parameters
    For Each Param In Params
    Text1.Text = Text1.Text & Param.Name & vbCrLf
    Next
    err:
    If Err.Number <> 0 Then
    Text1.Text = "err number: " & Err.Number & " : " & Err.Source & " : " &
    Err.Description
    End If
    End Sub

    You get the error number: -2147217839(80040e51) : OraOLEDB : Provider cannot derive parameter
    information and SetParameterInfo has not been called.



    Solution Description
    --------------------
    The error is due to the .Parameters.Refresh method.
    This is currently a limitation of our driver.


    Explanation
    -----------
    This bug relates to ADO .Refresh property which should be used only
    at the application design time and not in the production application.
    The use of .Refresh property causes one or more round trips to the
    database per call.

    Using this fonctionality in production applications can cause
    serious performance bottlenecks.
    Based on these feedbacks, we had decided not to support this property.


    References
    ----------
    Bug 2156923
    Que faire alors les amis ? Quelle est la parade dans un tel cas ?

  6. #6
    Membre expérimenté
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 219
    Points : 1 438
    Points
    1 438
    Par défaut
    Microsoft parle aussi de ce problème : http://support.microsoft.com/?scid=k...3802&x=14&y=13 et il y a aussi un autre article qui parle même du message "Le fournisseur ne peut pas obtenir les infos de paramètres et SetParameterInfo n'a pas été appelé"

  7. #7
    Membre expérimenté
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Argentine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 173
    Points : 1 418
    Points
    1 418
    Par défaut
    réussir à expliquer un problème, c'est y répondre pour plus de moitié.
    bonne continuation ...

  8. #8
    Membre expérimenté
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 219
    Points : 1 438
    Points
    1 438
    Par défaut
    merci !
    En fait, je vais chercher une parade à ce bug d'Oracle et je le posterai ici quand je l'aurai !

Discussions similaires

  1. Exécuter une procédure stockée PL/SQL Oracle sous Talend
    Par robinson50 dans le forum Développement de jobs
    Réponses: 4
    Dernier message: 03/11/2008, 10h51
  2. Réponses: 2
    Dernier message: 20/03/2007, 17h00
  3. [Oracle] Exécuter une procédure stockée sans en attendre le résultat
    Par glutock dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 14/02/2007, 13h54
  4. [PEAR][MDB2] Exécuter une procédure stockée
    Par mikedavem dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 06/01/2007, 09h33
  5. Réponses: 1
    Dernier message: 26/07/2006, 11h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo