Manipuler les bases de données à l'aide de l'API ODBC en C++
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:
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:
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:
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:
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 !