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

MFC Discussion :

[Visual C++] Problème ADO Access violation


Sujet :

MFC

  1. #1
    Membre confirmé
    Avatar de irnbru
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2004
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2004
    Messages : 316
    Points : 500
    Points
    500
    Billets dans le blog
    1
    Par défaut [Résolu] [Visual C++] Problème ADO Access violation
    Bonjour j'ai un problème épineux mais certainement possible à résoudre. voilà j'ai une classe "Database" qui permet d'ouvrir une base de donnée, des tables de manipuler tout cela etc voilà 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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
    bool Database::Open(char* UserName, char* Pwd,char* CnnStr)
    {
    	try
    	{
    		HRESULT hr;
    		hr    = m_Cnn.CreateInstance( __uuidof( ADODB::Connection ) );
    		m_Cnn->Open(CnnStr, UserName, Pwd, NULL);
    	}
     
    	CATCHERROR(m_Cnn,0)
     
    	sprintf(m_ErrStr,"Success");
    	return 1;
    }
     
    bool Database::OpenTbl(int Mode, char* CmdStr, Table &Tbl)
    {
    	if(m_Cnn==NULL)
    	{
    		Tbl.m_Rec=NULL;
    		sprintf(m_ErrStr,"Invalid Connection");
    		return 0;
    	}
    	RecPtr t_Rec=NULL;
    	try
    	{
     
    		t_Rec.CreateInstance( __uuidof( ADODB::Recordset ) );
    		t_Rec->Open(CmdStr,_variant_t((IDispatch *) m_Cnn, true),ADODB::adOpenStatic,ADODB::adLockOptimistic,Mode);
    	}
     
    	CATCHERROR(Tbl.m_Rec,0)
     
    	Tbl.m_Rec=t_Rec;
    	sprintf(m_ErrStr,"Success");
    	return 1;
    }
    bool Database::Close()
    {
     
    	if(m_Cnn==NULL)
     
    		return 0;
     
    	try
    	{
    		m_Cnn->Close();
    		m_Cnn=NULL;
     
    	}
    	catch(_com_error &e)
    	{
    		return 0;
    	}
    	return 1;
    }
    et la partie importante code client

    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
    if(! db.Open("","", AllAql.szDBFile))
    				{
    					ioError << "Erreur ACCESS : " << db.m_ErrStr << endl ;
    					bContinue = FALSE ;
    				}
    				else
    				{
     
     
     
    					if(! db.OpenTbl(ADODB::adCmdTable, "OPTIMISATION", tblOptimisation))
    					{
    						ioError << "Erreur ACCESS : Impossible d'accéder à la table OPTIMISATION" << endl ;
    						bContinue = FALSE ;
    					}
     
    					db.Close();
    					return 1;
     
    }
    }
    Cela plante avec le message d'erreur suivant :

    Unhandled exception in AASeq.exe (MSDART.Dll) : 0xC0000005 : access violation

    par contre si je met db.close; return 1 ; avant l'ouverture d'une table cela ferme bien.

    Quelqu'un peut m'aider?
    merci!

    IRNBRU

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 391
    Points : 347
    Points
    347
    Par défaut
    bonjour,
    Peut etre une aide pour toi,
    si ton CDatabase db, est declaré comme ça c'est une variable, et il ne peut ouvrir qu'une seule table en meme temps donc forcement fermer la table active avant d'en ouvrir un autre.
    Si tu le declare en CDatabase *db, tu cree un pointeur, des que ta besoin d'acceder a une de tes base avec le new tu cree un nouvelle objet que tu détruit a la fin par un free.

  3. #3
    Membre confirmé
    Avatar de irnbru
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2004
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2004
    Messages : 316
    Points : 500
    Points
    500
    Billets dans le blog
    1
    Par défaut
    Merci pour ton aide ricky78 mais cela n'était pas la solution précisement. Il fallait tout simplement mieux nettoyer les objets, notamment les objets pour accéder aux tables. Sinon ton idée était bonne du point de vue général à savoir bien s'assurer que les objets sont libérés.

    Il fallait etre sur que ces pointeur

    ADODB::_ConnectionPtr
    ADODB::_RecordsetPtr

    appelent la méthode Close puis les mettre à null!

    Si cela interesse certaines personnes je peux mettre le code à disposition.
    Ouf c'était chaud à résoudre étant donné que je suis totalement débutant en C++ et c'était pas mon code aussi!

    IRNBRU

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

Discussions similaires

  1. Problème d'access violation.
    Par 6-MarViN dans le forum Langage
    Réponses: 1
    Dernier message: 14/11/2012, 16h15
  2. Problème d'Access Violation avec lfind
    Par beegees dans le forum C
    Réponses: 4
    Dernier message: 22/01/2008, 15h00
  3. Réponses: 22
    Dernier message: 28/11/2007, 20h39
  4. Problème ADO - excel - access
    Par Margoulin79 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 04/06/2007, 13h35
  5. Problème Access Violation dans une classe
    Par randriano dans le forum C++Builder
    Réponses: 1
    Dernier message: 11/04/2007, 18h49

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