Bonjour, je travail sur code qui essaie de manipuler des bases de données en mode ODBC. je teste mon code s'il est connecté à ma table Employe(IdEmploye,Nom,Prenom,Raison Sociale,Matricule,IdPresAbs) en plus d'autre étape expliquer en commentaire dans le code.
le problème qui se pose c'est quand j'appelle la fonction qui ajoute des champs à ma base de donnée la fonction la ligne 35 du .cpp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
ajouterRecord(char*,int)
j'ai essayé de l'écrire en fonction mais ceci ne marche pas et je ne sais pas pourquoi pourtant le compilateur (Visual Studio) n'indique pas d'erreur???
le main.cpp
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
#define WINVER 0x0A00
#include <iostream>
#include <afxdb.h>
#include "RecordsetE.h"
using namespace std;
 
int main(){
			//objet database
	CDatabase dbGT_1_ODBC;		
			//source ODBC
	CString sDSN ("TestGTODBC");	
			//trouver connecter la base de donnee
	dbGT_1_ODBC.Open(sDSN);		
	if(dbGT_1_ODBC.IsOpen()){
		cout<<"-- DB trouvee et connectee! --" << endl;
	}else{cout << "-- DB pas trouvee ou echec de connexion! --" << endl;}
			//definir les objets necessaires
	CRecordsetE rsEmploye(&dbGT_1_ODBC);
	CString sSQL("SELECT* FROM employe");
			// ---- ouvrir et rechercher les enregistrements ----
	rsEmploye.m_strSort=_T("Nom");		//tri sur les noms
	rsEmploye.Open(CRecordset::dynaset,sSQL);
	if(!(rsEmploye.IsOpen() && rsEmploye.CanAppend())){
		cout<<"-- Recordset non connecte !"<<endl;}
			//ajouter un record à la table
	cout<<"voulez vous ajouter de nouveaux employes si oui cliquer 'O' si non cliquer 'N' ";
	char c='O';
	cin>>c;
	if(c=='O'){
		char* newEmploye=NULL;
		int element=0;
	cout<<"combien d'employe voulez vous entrer :";
	cin>>element;
	cout<<endl;
	rsEmploye.ajouterRecord(newEmploye,element);
	}
			//lister tout les records de la table
	rsEmploye.MoveFirst();		// aller au premier record de la table
	//boucle sur les enregistrements//IsEOF retourne 0 apres le dernier enregistrement
	while(!rsEmploye.IsEOF()){
				// récuperer les valeurs des champs
				// afficher les valeurs des champs
		cout<<rsEmploye.m_IdEmploye<<" - "<<rsEmploye.m_Nom<<" - "<<rsEmploye.m_Prenom;
		cout<<" - "<<rsEmploye.m_Raison_Sociale<<" - "<<rsEmploye.m_Matricule<<endl;
				// passer au record suivant
		rsEmploye.MoveNext();
	}
			// fermer le recordset
	rsEmploye.Close();
			//fermer (deconnecter) la base de donnee
	dbGT_1_ODBC.Close();		
	if(dbGT_1_ODBC.IsOpen()){
		cout << "-- DB echec de fermeture! --" << endl;
	}else{cout<<"-- DB deconnectee et fermee"<<endl;}
 
	return 0;
}
le fichier .h
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
#pragma once
#include <afxdb.h>
using namespace std;
 
class CRecordsetE: public CRecordset
{
public:
	// data membres correspondant aux champs de la table
	long m_IdEmploye;
	CStringA m_Nom;
	CStringA m_Prenom;
	CStringA m_Raison_Sociale;
	long m_Matricule;
	CString m_Telephone;
	long m_IdPresAbs;
public:
	CRecordsetE(CDatabase* );
	virtual ~CRecordsetE();
	// fonction de mappage
	virtual void DoFieldExchange(CFieldExchange*);
	void ajouterRecord(char*,int);
};
et le fichier où existe ma fonction le .cpp :
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
#include "RecordsetE.h"
#include <afxdb.h>
#include <iostream>
using namespace std;
 
CRecordsetE::CRecordsetE(CDatabase* pDatabase=NULL)
	:CRecordset(pDatabase)
{
	m_IdEmploye=0;
	m_Nom=_T("");
	m_Prenom=_T("");
	m_Raison_Sociale=_T("");
	m_Matricule=0;
	m_Telephone=_T("");
	m_IdPresAbs=0;
	m_nFields=7;		//nombre de champs
	m_nDefaultType=dynaset;		//mode d'ouverture par default
}
 
CRecordsetE::~CRecordsetE(void)
{
}
 
void CRecordsetE::DoFieldExchange(CFieldExchange* pFX)
{
	//champs à mapper
	pFX->SetFieldType(CFieldExchange::outputColumn);	
	RFX_Long(pFX,_T("[IdEmploye]"),m_IdEmploye);
	RFX_Text(pFX,_T("[Nom]"),m_Nom);
	RFX_Text(pFX,_T("[Prenom]"),m_Prenom);
	RFX_Text(pFX,_T("[Raison Sociale]"),m_Raison_Sociale);
	RFX_Long(pFX,_T("[Matricule]"),m_Matricule);
	RFX_Text(pFX,_T("[Telephone]"),m_Telephone);
	RFX_Long(pFX,_T("[IdPresAbs]"),m_IdPresAbs);
}
 
void CRecordsetE::ajouterRecord(char* newEmploye,int element)
{
	newEmploye=new char[element];
	newEmploye[0]='0';
	for(int j=0;j<element;j++){
		cout<<"entrer un nom pour l'employe "<<j++<<" :";
		cin>>newEmploye[j];
		cout<<endl;
	}
	for(int i=0;i<element;i++){
	this->AddNew();
	this->m_IdEmploye=6+i;
	this->m_Nom=newEmploye[i];
	this->m_Matricule=13001+i;
	this->Update();
	this->Requery();
	}
}
merci !