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 :

Type de retour pour ma requete SQL avec ADO !


Sujet :

MFC

  1. #1
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    281
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 281
    Points : 47
    Points
    47
    Par défaut Type de retour pour ma requete SQL avec ADO !
    Bonjour a tous !

    Je suis entrain de me faire une petite classe CGestionBd, me permettant de gérer des accès a ma base de donnée.
    Donc, une methode Connexion(DSN), Deconnexion(), ExecuteSql( CString requete)

    Voila, ma question se pose sur ma méthode "ExecuteSql", en fait, je lui passe en parametre une requete.
    Je souhaiterais ainsi que cette méthode "ExecuteSql" me retourne quelquechose afin de pouvoir interpréter ma requete.

    Me conseillez vous de retourner un tableau, ou alors un "_RecordsetPtr" ?
    Je pense que le _RecordsetPtr est plus approprié mais aparamment VisualC++ 6 ne reconnais pas ce type de retour ,alors que dans l'implémentation de ma classe, je peux utiliser ce type de pointeurs sans problème.

    Merci pour votre aide !

    Bonne journée

  2. #2
    Membre régulier Avatar de riadh_ado
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2006
    Messages : 90
    Points : 92
    Points
    92
    Par défaut Ado : Retrouvez vos données
    Primo tu declare comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    _CommandPtr pCmd;
    pCmd.CreateInstance(__uuidof(Command));
    pCmd->ActiveConnection = pConn;
    pCmd->CommandText = "Select * from ...................";
    _RecordsetPtr pRs;
    pRs = pCmd->Execute();
    ou bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    _RecordsetPtr pRs;
    pRs.CreateInstance(__uuidof(Recordset));
    pRs->PutRefSource(pCmd);
    ensuite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    // Create the variant NULL
    _variant_t vNull;
    vNull.vt = VT_ERROR;
    vNull.scode = DISP_E_PARAMNOTFOUND;
    // Open the recordset
    pRs->Open(vNull, vNull, adOpenDynamic, adLockOptimistic, adCmdUnknown);
    Tous ça aprés la connexion! tu devra être sur de ça sinon il ne marche pas

  3. #3
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    281
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 281
    Points : 47
    Points
    47
    Par défaut
    Merci de ta réponse!

    En fait, j'utiliser les smart-pointeur aussi :

    _RecordsetPtr pRecordSet = NULL; // pointeur pour le recordset
    _ConnectionPtr pConnection = NULL; //pointeur pour la base de donnee


    Je me connecte sans problème a ma base de donnée.
    J'execute ma requete sans problème.

    Mais je voudrais "retourner" le _RecordsetPtr !!!
    Afin de pouvoir l'interpréter autre part ( car je doit faire ca "clean" dans des classes, avec des méthodes...etc..)

    Merci

  4. #4
    Membre régulier Avatar de riadh_ado
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2006
    Messages : 90
    Points : 92
    Points
    92
    Par défaut Simple aide
    Je pense que je te compris, bon voila un exemple de ma projet
    1. Primo je fait la connexion comme ça

    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
    void CMaClasse::ConnexionBase(CString ch,CString commandSQL)
    {
    	pConn.CreateInstance(__uuidof(Connection));
    	m_strConnection="Provider=Microsoft.Jet.OLEDB.4.0;Data Source= ";
    	m_strConnection+=ch;//"Provider=Microsoft.Jet.OLEDB.4.0;Data Source= G:\\essai\\media\\debug\\dbEmploi.mdb";
    	m_strCmdText=commandSQL;//_T("select * from Matiere");
    	pConn->Open((LPCTSTR)m_strConnection,"","",adOpenUnspecified);
    	pCom.CreateInstance(__uuidof(Command));
    	pCom->ActiveConnection=pConn;
    	pCom->CommandText=(LPCTSTR)m_strCmdText;
    	pRs.CreateInstance(__uuidof(Recordset));
    	pRs->PutRefSource(pCom);
    	pRs->Open(vNull,vNull,adOpenDynamic,adLockOptimistic,adCmdUnknown);
    	if(FAILED(pRs->QueryInterface(
    		__uuidof(IADORecordBinding),(LPVOID*)&m_piAdoRecordBinding)))
    		_com_issue_error(E_NOINTERFACE);
    		
    }
    2. Cette fonction permet de chercher une etudiant selon son numero CIN (c’est pas interressent de le comprendre mais ce qui tu interresse c’est dans la balise gras.

    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
    void CMaClasse::OnOK() 
    {
    	// TODO: Add extra validation here
    	UpdateData(true);
    	bool trouve=false;
    	while((pRs->EndOfFile!=-1) && (trouve==false))
    	{
    		m_piAdoRecordBinding->BindToRecordset(&m_stagiaire);		if(m_stagiaire.m_cin==m_longcin)
    			trouve=true;
    		else
    			pRs->MoveNext();
    	}
    	if(trouve)
    		pRs->Close();
    	else
    		remp();
    	CDialog::OnOK();
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	Données membre de la classe CMaClasse
    o	IADORecordBinding*	m_piAdoRecordBinding;
    o	CStage m_stagaire;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class CStage: public CADORecordBinding  
    {
    	BEGIN_ADO_BINDING(CConnexionADO)
    		ADO_FIXED_LENGTH_ENTRY(1,adInteger,m_cin,lm_cin,true)
    		ADO_VARIABLE_LENGTH_ENTRY2(2,adVarChar,m_nom,sizeof(m_nom),lm_nom,true)
    		…………………………..	
    	END_ADO_BINDING()
    public:
    	CHAR m_nom[30];
    	CHAR m_prenom[30];
    	CHAR m_datenaiss[9];
    	CHAR m_adresse[50];
    	………………………
    };

  5. #5
    Membre régulier Avatar de riadh_ado
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2006
    Messages : 90
    Points : 92
    Points
    92
    Par défaut balise gras
    C'est dans la balise gras ce que tu t'interrese vraiment. je pense qui cette exemple devra t'aidé bon courage et A+

  6. #6
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    281
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 281
    Points : 47
    Points
    47
    Par défaut
    Arrrrrr lol

    Je ne comprend pas !
    Voici mon 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
     
    #import "C:\Program Files\Fichiers communs\System\ado\msado15.dll" no_namespace rename("EOF", "EndOfFile")
    inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);}; // ADO, pour utiliser TESTHR
    struct InitOle {
    	InitOle() {CoInitialize(NULL);} // A Mettre, sinon, erreur de Runtime !
    ~InitOle() {CoUninitialize();}
    } _init_InitOle_;
     
    // variables globales
    	CString valeur, affiche_valeur;
     
     
    /////////////////////////////////////////////////////////////////////////////
    // CAboutDlg dialog used for App About
     
    _RecordsetPtr pRecordSet = NULL; // pointeur pour le recordset
    _ConnectionPtr pConnection = NULL; //pointeur pour la base de donnee
    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
     
    void CBaseDeDonneeDlg::OnOK() 
    {	
     
    	try
    	{
    		pConnection.CreateInstance(__uuidof(Connection));
    		pConnection->ConnectionString="DSN=BdAccess"; // Parametres de connexions 
    		pConnection->Open( "", "", "", -1 ); // Connection à la base (Revoir utilité du -1)
    		AfxMessageBox("Connecté à la base avec succès");
     
    	}
    	catch(_com_error) // si erreur a la connection
    	{
    		MessageBox("Erreur a la connection a la base de donnee","ERREUR",MB_OK);
    	}
     
    }
    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
     
    void CBaseDeDonneeDlg::OnButtonExecuterSql() 
    {
     
    	CEdit * monEdit=(CEdit*)GetDlgItem(IDC_EDIT_REQUETE_SQL);
    	monEdit->GetWindowText(m_strRequete); // Je récupere la requete saisie dans l'EditBox.
     
    	CListBox * pListBoxAffiche = (CListBox *)GetDlgItem(IDC_LIST_AFFICHE);
     
     
    	TESTHR(pRecordSet.CreateInstance(__uuidof(Recordset)));//On crée un recordset vide:
     
    	try
    	{	
    		_variant_t var;// variable pour récupérer des données du recordset
     
    		pRecordSet->PutRefActiveConnection( pConnection ); // Type de connection
    		pRecordSet->Open((LPCTSTR)m_strRequete, vtMissing, adOpenDynamic,adLockBatchOptimistic, -1); // Requete SQL
    		/////////////////////////////////////////////////////////////////
    		//////////              TRAITER LE RECORDSET ////////////////////////////
    		/////////////////////////////////////////////////////////////////
    		pRecordSet->MoveFirst(); // Initialisation du recordset
     
    		long TotalFields = pRecordSet->Fields->GetCount();
     
    		while (!pRecordSet->EndOfFile) // Tant que la fin du recordset n'est pas atteinte
    		{
    			for(long i = 0; i < TotalFields -1 ; i++)
    			{
    				var=pRecordSet->Fields->GetItem(i)->Value; // Récupération de la valeure du recordset 
    				valeur = (LPCTSTR)_bstr_t(var); // On CASTE la valeur vers un CString 
    				affiche_valeur += valeur + "\t";
     
    			}
    			pRecordSet->MoveNext();// lecture de l'index suivant du recordset.
    			pListBoxAffiche->AddString(affiche_valeur);
    			valeur = "";
    			affiche_valeur = "";
    		}
     
     
    	}
    	catch(_com_error) // Si erreur durant l'execution du recordset
    	{
    		MessageBox("Erreur au niveau du recordset ou de votre requete","ERREUR",MB_OK);
    	}
     
    }
    Voila, je voudrais que ma fonction OnExecuterSql me retourne le _RecordsetPtr , et le compilateur ne veux pas

  7. #7
    Membre régulier Avatar de riadh_ado
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2006
    Messages : 90
    Points : 92
    Points
    92
    Par défaut slt
    bon je te comprend, mais plusieurs méthodes existent donc je te met ce document pour t'aidé. Bon courage et A+
    Fichiers attachés Fichiers attachés

  8. #8
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    281
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 281
    Points : 47
    Points
    47
    Par défaut
    Merci beaucoup,

    J'ai résolu le problème, je n'avais pas mis la ligne #import..... dans le .h de ma classe.

    Merci a tous!

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

Discussions similaires

  1. Besoin d'aide pour une requete SQL avec curdate()
    Par mulbzh dans le forum Langage SQL
    Réponses: 12
    Dernier message: 17/02/2015, 13h42
  2. Réponses: 0
    Dernier message: 02/03/2011, 23h26
  3. Requete sql avec ADO data environment
    Par nikolanta dans le forum VB 6 et antérieur
    Réponses: 0
    Dernier message: 26/06/2009, 07h22
  4. requete sql avec between sur des champs de type Date
    Par ersoufiane dans le forum Langage SQL
    Réponses: 2
    Dernier message: 02/08/2006, 19h43
  5. [JDBC] retour de requete sql avec valeur NULL
    Par maxxou dans le forum JDBC
    Réponses: 3
    Dernier message: 13/09/2004, 14h40

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