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

  1. #1
    Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    février 2021
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : février 2021
    Messages : 4
    Points : 2
    Points
    2
    Par défaut System.OutOfMemoryException*lors d'une ouverture de BDD ACCESS
    Bonjour,

    J'ai réussi à me dépatouiller grâce au forum pendant un moment mais à partir de maintenant mon problème est trop spécifique.
    Bien le voici. Je travaille sur un projet de production assistée par ordinateur, autrement dit je récupère des infos et je stock tout
    dans une base de donné pour en faire une belle interface par la suite.

    J'utilise actuellement 2 fonctions enfin une procédure et une fonction qui me sert à envoyer des donnés et l'autre a les récupérer.

    C'est dans cette dernière que mon problème arrive la fonction arrive à s'exécuter car est appelé lors du load de la forme mais pas les fois précédentes

    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
     
    Function RequeteSQLGet(requete As String, BDD As String)
     
            Dim Cnx, Rst, resultat As Object
     
            Cnx = CreateObject("ADODB.Connection")
            Rst = CreateObject("ADODB.Recordset")
            Cnx.Open("DRIVER={Microsoft Access Driver (*.mdb, *.accdb)}; DBQ=" & BDD)
            resultat = Rst.Open(requete, Cnx, 3)
     
            If Not Rst.RecordCount = 0 Then
     
                ReDim resultat(Rst.Fields.Count - 1, Rst.RecordCount - 1)
                Rst.MoveFirst
                resultat = Rst.GetRows
     
            End If
     
            Rst.close()
            Cnx.close()
     
            Return resultat
     
        End Function
    je suis sous framework 4.7.2 et avec ACCESS 2007 64 bit

    j'ai déjà tenté de filouter en débloquant les 2*Ko de mémoire RAM via les properties du projet mais rien n'y fait

    de plus l'erreur intervient ici:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Cnx.Open("DRIVER={Microsoft Access Driver (*.mdb, *.accdb)}; DBQ=" & BDD)
    et m'indique :

    System.OutOfMemoryException*: 'Une exception de type 'System.OutOfMemoryException' a été levée.'

    merci de votre réponse et du temps que vous m'accorderez

  2. #2
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    janvier 2018
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : janvier 2018
    Messages : 31
    Points : 46
    Points
    46
    Par défaut
    Bonjour,

    Je t'invite a faire un tour ici : https://docs.microsoft.com/fr-fr/dot...examples#oledb

    Face au fil d'ariane tu as un commutateur C# et VB

  3. #3
    Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    février 2021
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : février 2021
    Messages : 4
    Points : 2
    Points
    2
    Par défaut using
    merci de ton aide je testerais demain à la première heure néanmoins je croyais que les variables déclarées dans
    une fonction étaient forcément "détruites" à la fin de l’exécution.
    ici utiliser "using" ne fait-il pas redondance ?

    ou alors je n'ai pas compris ton message.

  4. #4
    Membre émérite Avatar de Phil Rob
    Homme Profil pro
    Enseignant retraité
    Inscrit en
    novembre 2013
    Messages
    1 267
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant retraité

    Informations forums :
    Inscription : novembre 2013
    Messages : 1 267
    Points : 2 253
    Points
    2 253
    Par défaut
    Bonsoir
    Le problème vient du ReDim. Je ne sais si son calcul représente une valeur fondée mais sûr que ReDim sans Dim préalable pour cette variable est source de soucis.
    Par ailleurs, pourquoi faire un ReDim ou même un Dim pour une structure qui est remplie " automatiquement " par la lecture de la DB.
    L'usage des RecordSet est obsolète, je ne les utilise plus depuis plus de 16 ans, c'est pourquoi je ne peux en dire plus sur ton accès à la DB, mais Dim et ReDim ...., ça ne va pas.
    ...

  5. #5
    Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    février 2021
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : février 2021
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Phil Rob Voir le message
    L'usage des RecordSet est obsolète
    Merci beaucoup pour l'analyse
    il est vrai que je j'ai surtout repris des exemples de tuto qui date un peu ... beaucoup
    Peux-tu m'aider à me documenter ou me donner des exemples d'exécution de requête car dans toutes les sources que j'ai consultées
    il y avait toujours l'usage d'un RecordSet

    Quant à la boucle elle me servait surtout pour les erreurs de requête ou des champs inaccessibles/vides

  6. #6
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    janvier 2018
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : janvier 2018
    Messages : 31
    Points : 46
    Points
    46
    Par défaut
    Citation Envoyé par hquentin Voir le message
    Merci beaucoup pour l'analyse
    il est vrai que je j'ai surtout repris des exemples de tuto qui date un peu ... beaucoup
    Peux-tu m'aider à me documenter ou me donner des exemples d'exécution de requête car dans toutes les sources que j'ai consultées
    il y avait toujours l'usage d'un RecordSet

    Quant à la boucle elle me servait surtout pour les erreurs de requête ou des champs inaccessibles/vides
    Encore et toujours et désolé mais encore une fois un autre lien avec la section OleDb : https://docs.microsoft.com/fr-fr/dot...g-a-datareader

    Entre les deux liens que je te propose tu as largement de quoi faire (connexion et exécution).

    merci de ton aide je testerais demain à la première heure néanmoins je croyais que les variables déclarées dans
    une fonction étaient forcément "détruites" à la fin de l’exécution.
    ici utiliser "using" ne fait-il pas redondance ?
    Pour ton apprentissage je pense qu'il faudrais que tu applique la base :
    je crée ma connexion, j'ouvre ma connexion, j'effectue mon opération (lecture, insertion,...), je libère mon opération (attention en mode lecture si tu libère trop vite tu perds la lecture), je ferme ma connexion.

    Bon code.

  7. #7
    Membre émérite Avatar de Phil Rob
    Homme Profil pro
    Enseignant retraité
    Inscrit en
    novembre 2013
    Messages
    1 267
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant retraité

    Informations forums :
    Inscription : novembre 2013
    Messages : 1 267
    Points : 2 253
    Points
    2 253
    Par défaut
    Re,

    ... Peux-tu m'aider à me documenter ou me donner des exemples d'exécution de requête ...
    Voici un exemple ..., un peu simple ..., ce n'est qu'une manière de faire et il en existe bien d'autres ..., dont notamment le "tout avec assistant" (que je ne conseille évidemment pas ... )

    Vois d'abord cette petite vidéo : https://www.dropbox.com/s/1fjchqpykw...strar.mp4?dl=0

    Et puis vois le code du projet : TestAccesDBSimpleConMostrar_.zip.

    Pour l'exécuter, tu dois modifier la chaine de connexion car ce sera forcement différent sur ton PC.

    Excuse les commentaires et "mots du programmeur" en espagnol, ils ne sont pas très difficiles à comprendre. Et puis, tu peux demander ...

    theWebBeginner t'as envoyé des liens vers de la doc Microsoft : n'oublie pas d'en prendre connaissance !

    Bonne soirée

  8. #8
    Expert confirmé
    Inscrit en
    avril 2008
    Messages
    2 516
    Détails du profil
    Informations personnelles :
    Âge : 61

    Informations forums :
    Inscription : avril 2008
    Messages : 2 516
    Points : 4 277
    Points
    4 277
    Par défaut
    Bonjour
    Je ne comprends pas pourquoi tu n'utilise pas ADO.NET pour acceder à la meme BD.
    C'est plus performant et plus facile à programmer.
    A moins que tu doives transposer un vieux code VB6 hérité.

  9. #9
    Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    février 2021
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : février 2021
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Bien voici le résultat de votre aide j'ai pu le remettre d'équerre et en tout cas sans l'utilisation d'un RecordSet

    pour répondre à MABROUKI

    non je pars d'un projet de zéro, étant encore étudiant je prends surtout mes sources sur internet et
    par conséquent je ne connais pas les "bonnes méthodes" comme l'utilisation d'un DataReader ou encore le bon provider.

    je pose quand même les deux procédures pour savoir s'il reste 2-3 choses mal optimisées
    mais surtout pour les prochains qui tomberont dessus

    également une autre source sous vb.net car j'ai eu du mal à transposer du C# au Vb ne connaissant même pas les base du premier

    https://dotnet.developpez.com/articles/ado1/vbnet/#LV


    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
        Function RequeteSQLGet(requete As String, InfoDemande As String)
     
            Try
     
                Dim oConnection As New OleDbConnection(Cnx.ConnectionString)
                Dim oCommand As New OleDbCommand(requete, oConnection)
                Dim reader As OleDbDataReader
                Dim resultat As Object = Nothing
     
                oConnection.Open()
                reader = oCommand.ExecuteReader()
     
                While reader.Read()
     
                    resultat = reader(InfoDemande)
     
                End While
     
                reader.Close()
                oConnection.Close()
     
                Return resultat
     
            Catch ex As Exception
     
                Console.WriteLine(("L'erreur suivante a été rencontrée :" + ex.Message))
     
            End Try
     
            Return "error"
     
        End Function

    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
        Sub RequeteSQLPull(requete As String)
     
            Try
     
                Dim oConnection As New OleDbConnection(Cnx.ConnectionString)
                Dim oCommand As New OleDbCommand(requete, oConnection)
                Dim resultat As Object = Nothing
     
                oConnection.Open()
                oCommand.ExecuteNonQuery()
                oConnection.Close()
     
            Catch ex As Exception
     
                Console.WriteLine(("L'erreur suivante a été rencontrée :" + ex.Message))
     
            End Try
     
        End Sub
    avec évidement la déclaration de chemin et de provider au load qui sont propres à chacun

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        Private Sub FormSupervision_Load(sender As Object, e As EventArgs) Handles MyBase.Load
     
            Dim cheminBDD As String = "C:\Users\quentin\Desktop\BDD-Access\BDD-PAO.accdb"
            Cnx.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & cheminBDD & ";"
     
        End Sub
    et voici comment je l'appelle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ...
            requete = "SELECT TOP 1 etat_machine FROM [COMMANDES] WHERE machine_requis = 'gallus5' ORDER BY id_commande DESC"
            ATMEtatGallus5 = RequeteSQLGet(requete, "etat_machine")
    ...
    merci encore de votre aide

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

Discussions similaires

  1. [AC-2010] Erreur Ressources Systemes insuffisantes lors d'une ouverture de table
    Par comme de bien entendu dans le forum IHM
    Réponses: 1
    Dernier message: 08/03/2016, 18h23
  2. Formulaire bloqué lors d'une ouverture par macro.
    Par Monsieur Peck dans le forum IHM
    Réponses: 6
    Dernier message: 16/06/2006, 17h41
  3. [VBA-E]fermer les fichier exel en cour lors d'une ouverture
    Par fournier dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 22/02/2006, 09h54
  4. déconnection lors d'une ouverture de compte (windows XP)
    Par ben_iap dans le forum Windows XP
    Réponses: 12
    Dernier message: 31/01/2006, 09h07
  5. activation macro lors d'une ouverture fichier Excel
    Par mirumoto dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 12/05/2005, 15h08

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