Fonctions PL/SQL avec VB.NET

Signaler
Messages postés
137
Date d'inscription
samedi 24 septembre 2005
Statut
Membre
Dernière intervention
12 avril 2013
-
Messages postés
137
Date d'inscription
samedi 24 septembre 2005
Statut
Membre
Dernière intervention
12 avril 2013
-
Bonjour,

j'ai un souci avec la communication d'une fonction PL/SQL et VB.NET. En fait, je suis en train de reprendre un programme qui a été développé il y a un moment et je dois en fait modifier une fonction PL/SQL pour récupérer plus d'informations. Donc, tout bêtement, dans PL/SQL Developer j'ai modifié cette fonction en y rajoutant les champs, tables et conditions dont j'avais besoin, et ça compile bien.

Maintenant, j'exécute mon programme sous V.S 2008 et lorsque je veux récupérer un champs, j'ai une erreur, et j'obtiens une erreur "OutOfRange"...

Donc je ne sais pas trop comment faire pour réussir à récupérer ces mes nouveaux champs, sachant que je débute dans ce genre de développement avec du PL/SQL...

Merci d'avance à ceux qui pourront m'aider.

Bonne journée à tous.

P.S : si vous avez besoin de plus de renseignements pour m'aider, n'hésitez pas, merci encore.

6 réponses

Messages postés
6063
Date d'inscription
dimanche 13 avril 2003
Statut
Modérateur
Dernière intervention
15 juillet 2011
28
Salut,

Sans code (vb.nbet et le retour de ta fonction) c'est difficile de répondre.
Il y a un probleme de definition de tableau surement

Tu essayes de lire à un index qui n'existe pas.
Messages postés
137
Date d'inscription
samedi 24 septembre 2005
Statut
Membre
Dernière intervention
12 avril 2013

Bonjour,

merci pour ta réponse. Donc voici le code; par contre, c'est peut-être pas le meilleur code qu'il peut y avoir, mais bon, le problème n'est pas là. Sur la partie de code en C/C tout est bien récupéré jusqu'à dr.CLE_RIB = ...

While MonReader.Read
    ' On remplit le datarow avec les infos récupérées de la BDD
    l_row = Me.RemplirRowAdh(MonReader)
End While

'Fonction RemplirRowAdh
Private Function RemplirRowAdh(ByVal dr_adh As OracleDataReader) As MajMut.MAJ_MUTUELLESRow
        'la variable dr est une row de dataset que l'on remplit
        Try
            [...]
            'RIB
                dr.TIT_COMPTE = dr_adh.GetValue(dr_adh.GetOrdinal("libtitban")).ToString().Trim
                dr.DOM_BANCAIRE = dr_adh.GetValue(dr_adh.GetOrdinal("libdomban")).ToString().Trim
                dr.CODE_BANQUE = dr_adh.GetValue(dr_adh.GetOrdinal("codban")).ToString().Trim
                dr.CODE_GUICHET = dr_adh.GetValue(dr_adh.GetOrdinal("codgui")).ToString().Trim
                dr.NUM_COMPTE = dr_adh.GetValue(dr_adh.GetOrdinal("numcomban")).ToString().Trim
                dr.CLE_RIB = dr_adh.GetValue(dr_adh.GetOrdinal("cleribrip")).ToString().Trim

                dr.CODPAYSISO = dr_adh.GetValue(dr_adh.GetOrdinal("Codpayiso")).ToString()
                dr.CLEIBAN = dr_adh.GetValue(dr_adh.GetOrdinal("cleiban")).ToString()
                dr.NUMBBAN = dr_adh.GetValue(dr_adh.GetOrdinal("numbban")).ToString()
                dr.CODBIC = dr_adh.GetValue(dr_adh.GetOrdinal("codbic")).ToString()

[...]


Et voici la fonction PL/SQL :

PROCEDURE GetStock(p_dt_trait  IN VARCHAR2,
                     p_compagnie IN VARCHAR2,
                     P_CURSOR    OUT r_cursor) IS
  
      str_cmd VARCHAR2(10000);
      str_comp VARCHAR2(200);
  
    BEGIN
    
      str_cmd := '
        SELECT ass.codliefam,
               ctr.numconadh,
               ctr.numadhuti,
               max_reg.codcaisec,
               max_adr.libvoiadr,
               max_adr.libcomadr,
               max_adr.codposadr,
               max_adr.libburadr,
               max_rib.libtitban,
               max_rib.libdomban,
               max_rib.codban,
               max_rib.codgui,
               max_rib.numcomban,
               max_rib.cleribrip,
               per.numinsper,
               per.cleinsper,
               per.numper,
               per.nomper,
               per.preper,
               to_char((TO_DATE(''01011900'',''ddMMyyyy'') + per.datnaiper),''yyyyMMdd'') datnaiper,
               per.numrannai,
               per.datdecper,
               num.Idexterne   id_ext,
               prd.codstd,
               to_char((TO_DATE(''01011900'',''ddMMyyyy'') + pera.debperass),''yyyyMMdd'') debperass,
               pera.finperass,
               max_noe.per_valide,
               I.Codpayiso,
               I.cleiban,
               I.numbban,
               I.codbic
               
        FROM prdstd   prd,
             optstd   std,
             optpro   pro,
             ibanbic  I,
             ribpesoc ribp,
             contrcol con
             
             -- Jointure sur Numintext
                   LEFT OUTER JOIN Numintext num ON  num.Numobj = con.numsoucon
                                                 AND num.Numsysext=3
                                                 AND num.Indtypobj=2,
                                                     
             personne per
                                                                                     
             -- Jointure sur regssper
                   LEFT OUTER JOIN (
                                    SELECT r.codcaisec,
                                           r.numper
                                    FROM regssper r
                                    INNER JOIN(
                                               SELECT MAX(reg.debregsec)deb,reg.numper
                                               FROM regssper reg
                                               GROUP BY reg.numper
                                               )rr ON  rr.deb = r.debregsec
                                                   AND rr.numper = r.numper
                                   ) max_reg ON max_reg.numper = per.numper
                              
             -- Jointure sur adrpesoc
                   LEFT OUTER JOIN (
                                    SELECT a.numpersoc,
                                           a.libvoiadr,
                                           a.libcomadr,
                                           a.codposadr,
                                           a.libburadr
                                    FROM adrpesoc a
                                    INNER JOIN(
                                               SELECT MAX(adr.numadr)deb,adr.numpersoc
                                               FROM adrpesoc adr
                                               WHERE adr.BOOVALADR <> 0
                                               GROUP BY adr.numpersoc
                                              ) aa ON  aa.deb = a.numadr
                                                   AND aa.numpersoc = a.numpersoc
                                   ) max_adr ON max_adr.numpersoc = per.numper
                   
             -- Jointure sur ribpesoc
                   LEFT OUTER JOIN (
                                    SELECT ri.numpersoc,
                                           ri.libtitban,
                                           ri.libdomban,
                                           ri.codban,
                                           ri.codgui,
                                           ri.numcomban,
                                           ri.cleribrip
                                    FROM ribpesoc ri
                                    INNER JOIN(
                                               SELECT MAX(rib.numribrip)deb,rib.numpersoc
                                               FROM ribpesoc rib
                                               WHERE rib.BOOVALRIB <> 0
                                               GROUP BY rib.numpersoc
                                              ) rri ON  rri.deb = ri.numribrip
                                                    AND rri.numpersoc = ri.numpersoc
                                   ) max_rib ON max_rib.numpersoc = per.numper
                                   
             -- Jointure sur perionoe
                     LEFT OUTER JOIN (
                                      SELECT max(noe.finpernoe)per_valide,
                                             noe.numper
                                      FROM perionoe noe
                                      WHERE TO_DATE(''01011900'',''ddMMyyyy'') + noe.debpernoe <=  to_date('''  || p_dt_trait || ''',''dd/MM/yyyy'')
                                      AND   noe.debpernoe <> -222222
                                      AND   (
                                             noe.finpernoe = 3333333 OR
                                             TO_DATE(''01011900'',''ddMMyyyy'') + noe.finpernoe >=  to_date('''  || p_dt_trait || ''',''dd/MM/yyyy'')
                                             )
                                      GROUP BY noe.numper
                                     )max_noe ON max_noe.numper = per.numper,
                                   
             contradh ctr,
             assure   ass,
             perassur pera
             
        /*INNER JOIN (select MAX(p.debperass)deb ,
                           p.numconadh
                   FROM perassur p
                   GROUP BY p.numconadh
                   ) max_p
                   ON max_p.deb = pera.debperass
                   AND max_p.numconadh = pera.numconadh*/
                   
        WHERE prd.numpro = std.numprostd
        AND   std.datfingen = 3333333
        AND   std.numgrp = 0
        AND   std.numpro = pro.numpro
        AND   std.numoptpro = pro.numoptpro
        AND   pro.numpro = con.numpro
        AND   con.NUMCONcol = ctr.numconcol
        AND   (
               TO_DATE(''01011900'',''ddMMyyyy'') + ctr.finconadh > to_date('''  || p_dt_trait || ''',''dd/MM/yyyy'') OR
               ctr.finconadh = 3333333
              )
        AND   ctr.indvaladh = ''V''
        AND   ctr.numconadh = pera.numconadh
        AND   (
               TO_DATE(''01011900'',''ddMMyyyy'') + pera.finperass > to_date('''  || p_dt_trait || ''',''dd/MM/yyyy'') OR
               pera.finperass = 3333333
              )
        AND   ass.numperass = pera.numperass
        AND   ass.numperass = per.numper
        AND   ass.numconadh = pera.numconadh
        AND   I.NUMOBJ1     = ribp.NUMPERSOC
        AND   I.INDTYPOBJ   = 1
        AND   I.NUMOBJ2 = ribp.NUMRIBRIP
        '
        ;
        
        IF p_compagnie = 'MMA' THEN
          str_comp := 'AND   prd.codstd IN (''MMA01ACT'', ''MMA01RET'', ''MMA01EXT'')';
        ELSIF p_compagnie = 'MOCEN' THEN
          str_comp :'AND   prd.codstd ''MOC01ACT''';
        ELSIF p_compagnie = 'AGF' THEN
          str_comp := 'AND   prd.codstd IN (''AGF01ACT'', ''AGF01RET'', ''AGF01EXT'')';
        ELSE
          RAISE_APPLICATION_ERROR(-22222,'Code Compagnie erroné : ' || TRIM(p_compagnie));
        END IF;
        
      str_cmd := str_cmd || str_comp || '
            GROUP BY ass.codliefam,
                     ctr.numconadh,
                     ctr.numadhuti,
                     max_reg.codcaisec,
                     max_adr.libvoiadr,
                     max_adr.libcomadr,
                     max_adr.codposadr,
                     max_adr.libburadr,
                     max_rib.libtitban,
                     max_rib.libdomban,
                     max_rib.codban,
                     max_rib.codgui,
                     max_rib.numcomban,
                     max_rib.cleribrip,
                     per.numinsper,
                     per.cleinsper,
                     per.numper,
                     per.nomper,
                     per.preper,
                     per.datnaiper,
                     per.numrannai,
                     per.datdecper,
                     num.Idexterne,
                     prd.codstd,
                     pera.debperass,
                     pera.finperass,
                     max_noe.per_valide,
                     I.Codpayiso,
                     I.cleiban,
                     I.numbban,
                     I.codbic';

      OPEN P_CURSOR FOR str_cmd;
    
  END GetStock;
Messages postés
6063
Date d'inscription
dimanche 13 avril 2003
Statut
Modérateur
Dernière intervention
15 juillet 2011
28
Ok,

Je comprends mieux

Donc c'est la fonction GetOrdinal qui renvoit un index inconnu ??

Apres je ne vois pas pourquoi? Les noms de colonnes sont bien orthographiés.

Donc pour trouver plus facilement, vas dans visual studio
Menu debug>Exceptions ....>
Coches sur la deux ou troisieme la checkbox throw
qui correspond à la clr exception

Et là visual studio s'arretera direct sur l'erreur et avec les espions recherche ce qui ne va pas.

Bon courage.
Messages postés
137
Date d'inscription
samedi 24 septembre 2005
Statut
Membre
Dernière intervention
12 avril 2013

J'ai déjà essayé de débuguer en pas à pas et voir avec les espions, mais ça ne m'aide pas plus, il n'arrive tout simplement pas à récupérer les champs que je lui demande dans la requête.

Bref, je vais chercher encore un peu, sinon j'opterais pour une autre solution en faisant une nouvelle requête avec un paramètre commun pour récupérer mes infos. Ça sera moins prise de tête de faire du nouveau code que de reprendre un code fait y a 5 ans...

En tout cas, merci encore.
Messages postés
6063
Date d'inscription
dimanche 13 avril 2003
Statut
Modérateur
Dernière intervention
15 juillet 2011
28
Tu es sur que c'est
dr.CODPAYSISO = dr_adh.GetValue(dr_adh.GetOrdinal("Codpayiso")).ToString()

qui pete.

Si tu mets cette ligne en commentaire, ton programme fonctionnne.


dans chaque dr_adh.GetOrdinal("XYZ") le XYZ correspond avec un nom de colonne resultat de ta procedure et respecte la casse.
Messages postés
137
Date d'inscription
samedi 24 septembre 2005
Statut
Membre
Dernière intervention
12 avril 2013

Oui oui, ca pète aussi. En fait, ca pète pour ces 4 lignes :

dr.CODPAYSISO = dr_adh.GetValue(dr_adh.GetOrdinal("Codpayiso")).ToString()
                dr.CLEIBAN = dr_adh.GetValue(dr_adh.GetOrdinal("cleiban")).ToString()
                dr.NUMBBAN = dr_adh.GetValue(dr_adh.GetOrdinal("numbban")).ToString()
                dr.CODBIC = dr_adh.GetValue(dr_adh.GetOrdinal("codbic")).ToString()


Et pourtant, j'ai fait des C/C des noms de colonnes. Donc je ne sais pas trop. Je vais passer par une autre méthode comme je l'ai dit plus haut. En tout cas, merci pour ton aide.