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

Macros et VBA Excel Discussion :

Erreur de lecture de recordset: -2147467259 "Ce type de données n'est pas pris en charge." [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur décisionnel
    Inscrit en
    Février 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur décisionnel

    Informations forums :
    Inscription : Février 2017
    Messages : 4
    Par défaut Erreur de lecture de recordset: -2147467259 "Ce type de données n'est pas pris en charge."
    Bonjour,

    Je souhaite extraire les données de tables Oracle dynamiquement: dans l'onglet Requetes, j'ai défini les requêtes à exécuter par table. Le résultat d'une requête est stocké dans un onglet du nom de la table extraite.
    L'extraction se passe bien lorsque la requête retourne des données. En revanche lorsque la requête ne retourne pas de donnée j'obtiens l'erreur -2147467259 "Ce type de données n'est pas pris en charge." sur le Rs.open. Le traitement plante avant le test EOF.

    Pouvez-vous svp m'éclairer sur ce problème?
    Merci.

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    Sub extraction()
    Dim cnx As New ADODB.Connection
    Dim Sql As String
    Dim Rs As New ADODB.Recordset
    Dim Feuille As Worksheet
    Dim NomTable As String
    Dim ColTable As Integer  ' colonne contenant le nom des tables
    Dim ColSql As Integer  ' colonne contenant les requêtes sql
    Dim LigneMax As Integer ' ligne max des tables à extraire
    Dim i, j As Integer
    Dim wbs As Workbook, wfs As Worksheet
     
    ColTable = 3
    ColSql = 6
    LigneMax = 38
    Set wbs = ActiveWorkbook
     
    ' Paramètres de connexion
    User = 'Valeur du user
    PassWord = 'Valeur du mot de passe
    Server = 'Valeur du serveur
     
    GenereCSTRING = "Provider=MSDAORA.1;User ID=" & User & ";Data Source=" & Server & ";Password=" & PassWord
    cnx.Open GenereCSTRING
     
    'Vérifie que la connexion est bien fermée
      If cnx.State = adStateOpen Then
        cnx.Close
      End If
     
      'Connexion à la base de données
       cnx.Open GenereCSTRING
     
       For i = 2 To LigneMax
            Sheets("Requetes").Select
            NomTable = Sheets("Requetes").Cells(i, ColTable)
            Sql = Sheets("Requetes").Cells(i, ColSql)
     
            ' Test si il existe déjà un onglet pour la table : si il existe on le supprime avant de la recréer
            If (FeuilleInexistante(NomTable) = False) Then
                    ' désactivation des messages de confirmation
                    Application.DisplayAlerts = False
                    Sheets(NomTable).Delete
                    ' réactivation des messages de confirmation
                    Application.DisplayAlerts = True
            End If
            Set Feuille = Sheets.Add(After:=Sheets(Sheets.Count))
            Feuille.Name = NomTable
     
            ' Exécution de la requête
             Rs.Open Sql, cnx ', 1, 3
     
            k = Rs.RecordCount
            ' Récupération des noms des colonnes
            If Rs.BOF And Rs.EOF Then
                Feuille.Cells(1, 1) = "Pas de données"
            Else
                For j = 1 To Rs.Fields.Count
                    Feuille.Cells(1, j) = Rs.Fields(j - 1).Name
                Next j
     
                ' Récupération des données
                Feuille.Range("a2").CopyFromRecordset Rs
            End If
            Rs.Close
        Next i
     
    AdoErrorLite:
           ' Get VB Error Object's information
           strTmp = strTmp & vbCrLf & "VB Error # " & Str(Err.Number)
           strTmp = strTmp & vbCrLf & "   Generated by " & Err.Source
           strTmp = strTmp & vbCrLf & "   Description  " & Err.Description
     
           MsgBox strTmp
     
    End Sub

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Ce n'est pas que la requête ne retourne rien c'est qu'elle est fausse !

    Erreur de syntaxe???
    Avant Rs.open place un debug et copy le script de la fenêtre d'exécution raccourci clavier [Ctrl] + [g] dans Sql manager et exécute la
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ' Exécution de la requête
    Début.print Sql
    Rs.Open Sql, cnx ', 1, 3
    Dernière modification par Invité ; 14/02/2017 à 18h37.

  3. #3
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour
    Et je ne comprends personnellement pas ce code (apparemment un copié/collé incomplètement copié et collé) qui passe systématiquement par l'étiquette AdoErrorLite:.
    Je ne vois aucune gestion d'erreur renvoyant à cette étiquette, ni de sortie de la procédure si pas d'erreur.

    Je ne comprends pas non plus le sens exact de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Rs.BOF And Rs.EOF Then
    d'autant que cette ligne est précédée de la valeur k (compte des enregistrements).
    Tout cela est bizarre...

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour unparia,
    GenereCSTRING provient du module se classe que j'ai publié su ge forum!

    Il y a quelques liberté avec le code mais dans l'ensemble l'idée y est!

    Non je pense que le script Sql est erroné!

    Une requête qui ne retourne rien place eof et bof a true hors l'erreur ce produit a Rs.open car la requête n'est pas bonne

    Personnellement je préfère un plantages de l'application a une gestion d'erreur male ficelée.

    En revanche vue qu'il n'y a pas de on error AdoErrorLite ne jamais activités! (enfin presque)

  5. #5
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    bien que je n'y connaisse pas grand chose sur ce type de code, est-ce normal d'avoir deux fois l'ouverture de connexion ?


  6. #6
    Invité
    Invité(e)
    Par défaut
    Non c'est inutile mais ça ne pose pas de problème!
    Dernière modification par AlainTech ; 06/03/2017 à 21h18. Motif: Suppression de la citation inutile

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Développeur décisionnel
    Inscrit en
    Février 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur décisionnel

    Informations forums :
    Inscription : Février 2017
    Messages : 4
    Par défaut
    Merci pour les 1ères réponses.
    Effectivement le code n'est pas très épuré.
    Après avoir fait plusieurs tests je n'ai pas encore tout remis au propre, désolé.

    Pour la requête sql, j'avais ajouté un espion sur la variable sql et en mode debug j'ai récupéré la valeur de la variable. La requête ainsi récupérée s'exécutait bien sous Toad mais ne retournait aucune donnée, contrairement aux autres. La seule différence que je voyais entre les requêtes qui s'exécutaient correctement et celles qui étaient KO était le nombre de lignes en retour.
    Je testerai demain ou jeudi la requête sur la même table qui me pose problème mais avec une clause where différente pour qu'elle retourne des données.
    Je ferai un retour suite à ce test.

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Développeur décisionnel
    Inscrit en
    Février 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur décisionnel

    Informations forums :
    Inscription : Février 2017
    Messages : 4
    Par défaut
    Bonjour,

    Le problème n'est effectivement pas lié au fait que la requête aucune donnée, ce n'est pas non plus lié à un problème de syntaxe.
    Cela est dû à la présence de champ timestamp.
    J'ai une solution de contournement en convertissant ces champs en date par exemple mais cela nécessite de nommer tous les champs à extraire au lieu de faire une select *.
    Existe-t-il un moyen pour que le timestamp soit reconnu?

  9. #9
    Invité
    Invité(e)
    Par défaut
    bonjour,
    ce sont des champs utilisable en statistiques, personnellement je les trouvaient utile dans ce but, mais ils me foutaient le bordel!

    une requête d'ajout m’engueulait si je ne les renseignait pas, et me disait que je ne pouvais pas les renseigner quand je le faisais! je les ai enlevés! .

    dans ton cas, peut être peux tu énumérer tes champs! select [champ1],[champ2],[Etc] from [table] à la place de select * from [table]

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Développeur décisionnel
    Inscrit en
    Février 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur décisionnel

    Informations forums :
    Inscription : Février 2017
    Messages : 4
    Par défaut
    Merci dysorthographie pour ton aide.
    L'énumération des champs est effectivement la solution de contournement. C'est un peu plus lourd à mettre en place mais ça marchera.
    Merci!!

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 18/03/2014, 20h39
  2. erreur : "La topologie actuelle n'est pas prise en charge"
    Par chantalboyer dans le forum Installation
    Réponses: 0
    Dernier message: 28/12/2010, 19h32
  3. Erreur: Ensemble de donnée n'est pas en mode édition
    Par pascal07 dans le forum Bases de données
    Réponses: 4
    Dernier message: 07/11/2008, 21h20
  4. Erreur de lecture du flux sous SQLServer
    Par smazaudi dans le forum Bases de données
    Réponses: 4
    Dernier message: 29/03/2005, 14h30
  5. [ADO] Sauvegarde / lecture de recordset
    Par SpaceFrog dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 20/09/2002, 16h54

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