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.NET Discussion :

champs numériques dans un recordset


Sujet :

VB.NET

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 38
    Points : 14
    Points
    14
    Par défaut champs numériques dans un recordset
    J'effectue des interrogations vers une base de donnée (oracle, 8i)
    j'utilise les objets adodb connection et adodb.recordset


    Mon problème (j'en ai eu d'autres mais celui-ci demeure) est que si, dans mon select, je fais appel à des colonnes dont le type est différent d'un type caractère (varchar2 par exemple), la requête plante.

    Si j'appelle des colonnes qui contiennent des enregistrements de type entiers, décimaux ou numériques, ça ne passe pas et je suis obliger - dans la requête - de convertir ces colonnes en caractères (to_char).
    C'est un peu lourd, non ?


    Avez-vous déjà rencontré ce problème ? Comment puis-je le contourner ?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     With MyConnect 
      .ConnectionString = "ODBC;UID=DWH;PWD=DWH;DSN=S0156_XDWA;" .Open   .CursorLocation = adUseClient 
    End With 
    MyRequete = "select " _ & "to_char(ID_RPN_NIV) niv," _ & "to_char(sum(decode(cd_rpn_grp_grp_pvt_cla,'G1',1))) G1," _ & "to_char(sum(decode(cd_rpn_grp_grp_pvt_cla,'G2',1))) G2," _ & "to_char(sum(decode(cd_rpn_grp_grp_pvt_cla,'G3',1))) G3 " _ & "FROM vw_pvt_classif_grp_pvt vw, tb_d_ref ref, tb_i_vte_ref_jou vte " _ & "WHERE vte.id_pvt=vw.id_pvt and vte.id_ref=ref.id_ref and " _ & "vte.id_tps_jou BETWEEN " & DtDeb & " AND " & DtFin & " " _ & "AND ref.cd_ref='" & RefAndre & "' and " _ & "id_rpn_niv = " & Str(idclaniv) & " " _ & "GROUP BY to_char(ID_RPN_NIV);" 
     
    With MyRecSet 
      .CacheSize = 50 
      .Open MyRequete, MyConnect, adOpenDynamic, adLockReadOnly 
    End With

  2. #2
    Membre chevronné
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 179
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 179
    Points : 1 776
    Points
    1 776
    Par défaut
    Bonjour.

    Encore un bonne raison de passer par l'API fournit par Oracle ;-) !

    Quelle erreur as-tu ? Qu'est-ce qui ne passe pas ?

    Cdt.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 38
    Points : 14
    Points
    14
    Par défaut
    Salut Olsimare,

    Ce sera donc encore toi mon sauveur !

    Comme je l'ai dit, j'ai un problème avec les champs de type numérique dans mon Recordset. Je reçois une erreur d'exécution '-2147467259 (80004005)' lorsque j'ouvre le recordset

    Si je remplace le champ numérique dc_col1 par to_char(dc_col1) ou que je le concatène avec un champ texte par exemple ''||dc_col1, ça marche parfaitement.

    J'utilise un driver odbc oracle... pas tout récent certes (pour des problèmes de compatibilités avec une autre application) 8.00.04.00 sqora32.dll 04/05/1998

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 38
    Points : 14
    Points
    14
    Par défaut Api ?
    J'utiliserais bien les API de Oracle à la place de ADODB mais je n'ai trouvé nul part de description des commandes/objets/méthodes relative à de tels API ni lesquelles utiliser.

    dans la bibliothèque des références VB je dispose, entre autre, des composants suivants :
    ORAOLEDB 1.0 Type Library [oraoledb.dll]
    Oracle Data Control [oradc.ocx](ça devrait être utile ça, non ?)

  5. #5
    Membre chevronné
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 179
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 179
    Points : 1 776
    Points
    1 776
    Par défaut
    Bonjour.

    Pour le pb avec les données numériques, ça sent le probléme d'install des composants client d'Oracle utilisés par OleDB (en fait c'est ce que j'en tire d'une petite recherche sur le WEB, et c'est surement à creuser). Je n'ai jamais eu ce probléme personnellement et (snif !!!) je n'ai plus Oracle !

    Pour utiliser directement les composants Oracle, moi j'installais SQL*NET ce qui installe aussi la fameuse dll Oracle InProc Server 3.0 (en 8.1 elle traine dans un répertoire ..\ora81\bin et s'appelle oip8.tlb).

    Par contre, les objets utilisés sont spécifiques à Oracle (normal).

    Si tu arrives à trouver cette DLL, voici un exemple à 2 francs (en VBA Excel) :

    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
    35
    36
    37
    38
     
    Public Sub chargeTableDansExcel()
        Dim odRecordSet As OraDynaset
        Dim OraDataBase As OraDataBase
        Dim OraSession As OraSessionClass
        Dim flds() As OraField
        Dim i, fldcount As Integer
     
        Set OraSession = CreateObject("OracleInProcServer.XOraSession")
        Set OraDataBase = OraSession.OpenDatabase("BATCH", "batch/batch", 0)
        Set odRecordSet = OraDataBase.CreateDynaset("SELECT * FROM USER_OBJECTS WHERE object_type = 'TABLE'", ORADYN_NOCACHE)
     
        fldcount = odRecordSet.Fields.Count
        ReDim flds(0 To fldcount - 1)
     
        For i = 0 To fldcount - 1
            Set flds(i) = odRecordSet.Fields(i)
        Next i
     
        Sheets(1).Select
        Range("A1").Select
     
        i = 1
     
        Do Until odRecordSet.EOF
            Cells(i, 1).Value = flds(0).Value
            odRecordSet.MoveNext
            i = i + 1
        Loop
     
        odRecordSet.Close
        OraDataBase.Close
     
        Set odRecordSet = Nothing
        Set OraSession = Nothing
        Set OraDataBase = Nothing
     
    End Sub

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 38
    Points : 14
    Points
    14
    Par défaut it works !
    bon ben ça marche !


    Tu avais encore une fois raison.
    Mieux vaut donc utiliser les connecteurs natifs de Oracle plutôt que passer par odbc à travers AdoDb.

    Merci...
    Olsimare, je crois que je te dois un resto !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-97] Mise à jour de champs calculés dans un recordset
    Par pdata dans le forum VBA Access
    Réponses: 5
    Dernier message: 22/10/2009, 11h17
  2. Mise à jour d'un champ calculé dans un recordset
    Par pdata dans le forum VB 6 et antérieur
    Réponses: 0
    Dernier message: 21/10/2009, 10h28
  3. Champs numérique dans TextBox
    Par Jiyuu dans le forum VB.NET
    Réponses: 5
    Dernier message: 13/03/2007, 22h28
  4. Réponses: 2
    Dernier message: 04/05/2006, 11h34
  5. Champs numériques dans une base de données à exporter
    Par ulukahio dans le forum Autres langages
    Réponses: 18
    Dernier message: 16/03/2005, 10h50

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