Problème Base de Données Bilbio de Classe

Signaler
Messages postés
190
Date d'inscription
dimanche 10 avril 2005
Statut
Membre
Dernière intervention
4 juillet 2007
-
Messages postés
190
Date d'inscription
dimanche 10 avril 2005
Statut
Membre
Dernière intervention
4 juillet 2007
-
Salut

Je débute en C++ mais en BTS j'ai travaillé sur du C#, et j'avais fait une bibliothèque de classe avec plein de fonctions sur les bases de données, manipulation de fichiers, de chaines,etc.
J'essaye de l'adapter pour qu'elle passe en C++, pour l'instant je m'interesse à celle sur la base de données, mais je rencontre beaucoup d'erreurs.
J'utilise un Pilote OleDb car normalement il passe en C++ et en C#.

Voici le code de la classe BasedeDonnees :

#include

"string"using

namespace System;
using

namespace System::Collections;
using

namespace std;
using

namespace System::Data;
using

namespace System::Data::OleDb;
namespace

Utilitaires {

public
ref
class BasedeDonnees{

      public:      BasedeDonnees(

void);

      //Les Bases De Données

      // "Crée Connexion Access "

      OleDbConnection Connection(std::string Bd)

      {

//On tente d'accèder à la base de données

//Chaîne de Connexion à la Basestd::string driver =

"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=";std::string extension =

".mdb";std::string chainedeconnexion =

"@"+driver+
"Bd"+extension;

//Preparation de la Connexion à la Base de DonnéesOleDbConnection ObjetConnection =

gcnew OleDbConnection();

ObjetConnection =

gcnew OleDbConnection(chainedeconnexion);

//Ouverture de la Connection avec Access sur la Base de DonnéesObjetConnection.Open();

return ObjetConnection;

}

public :

// "Execute Requete"OleDbDataReader Requete(std::string requete,OleDbConnection ObjetConnection)

{

OleDbDataReader myReader=

"";
//lecteur de Données
//Execution d'une Requete SQLOleDbCommand ObjetCommand gcnew OleDbCommand(requete);ObjetCommand.Connection ObjetConnection;

myReader=ObjetCommand.ExecuteReader();

return myReader; }

// "Fermer La Connection"

void FermerConnection(OleDbConnection ObjetConnection){

ObjetConnection->Close();

}

// "Traite les Requetes de plusieurs resultats dans un seul champ"ArrayList PlusResultOneColString(OleDbDataReader lect)

{

ArrayList ^ Resultat =

gcnew ArrayList ();

int i;

if(lect.HasRows){

i=0;

while (lect.Read()){

Resulta.Add(lect.GetValue(i)+

"");i=i+1;

}

}

return Resultat;}

// "Traite les Requetes contenant un seul résultat string"

char OneResultOneColString(OleDbDataReader lect){

std::string ligne=

"";

if(lect.Equals(
"")){

while (lect.Read()){

ligne= lect.GetString(0);

}

}

return ligne;}

// "Traite les Requetes contenant un seul résultat entier"

int OneResultOneColEntier(OleDbDataReader lect){

int ligne= 0;

if(lect.Equals(
"")){

while (lect.Read()){

ligne = lect.GetInt32(0);

}

}

return ligne;}

};

}

Quelqu'un pourrait-il me dire d'après lui ce qui cloche dans le code ?
Merci d'Avance
Maiku

19 réponses

Messages postés
746
Date d'inscription
vendredi 17 juin 2005
Statut
Membre
Dernière intervention
23 mai 2007
9
OleDbConnection ObjetConnection = gcnew
OleDbConnection();

Ca n'est pas plutôt :


OleDbConnection^ ObjetConnection = gcnew
OleDbConnection();








<hr size="2" width="100%" />
Sachant qu'on peut toujours enlever une ligne à un programme, et que dans un programme il y a toujours un bug, un programme peut se résumer à une ligne avec un bug.
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
21
Attention, en C# les objets sont tous des références. Et ici tu utilises en C++ des objets valeurs, aucune communication par référence ou pointeurs. Je ne dis pas que c'est pas bien, mais que tu fais beaucoup de copie.
ex :
OleDbDataReader myReader = "";
...
myReader = executeReader()...
return myReader;
Messages postés
190
Date d'inscription
dimanche 10 avril 2005
Statut
Membre
Dernière intervention
4 juillet 2007

Salut

Connection^ ObjetConnection = gcnew OleDbConnection();
A quoi sert le ^?

En ce qui concerne les copies genre pour le OleDbDataReader, c'est parce que en C# il faut l'initialiser avant de l'utiliser.

Maiku
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
21
Oui mais quelles sont les erreurs du compilateur ?
Messages postés
746
Date d'inscription
vendredi 17 juin 2005
Statut
Membre
Dernière intervention
23 mai 2007
9
Si je me rappelle bien des deux semaine où j'ai fait du C++ .NET / CLI, je pense qu'il faut mettre des ^ pour indiquer au compilateur que ce sont des objets gérés par le runtime .NET. Le gcnew sert à la même chose.

<hr size="2" width="100%" />Sachant qu'on peut toujours enlever une ligne à un programme, et que dans un programme il y a toujours un bug, un programme peut se résumer à une ligne avec un bug.
Messages postés
190
Date d'inscription
dimanche 10 avril 2005
Statut
Membre
Dernière intervention
4 juillet 2007

Il y en a plusieurs :

Error 3 error C2664: 'System::Data::OleDb::OleDbConnection::OleDbConnection(System::String ^)' : cannot convert parameter 1 from 'std::string' to 'System::String ^' c:\documents and settings\amy\mes documents\visual studio 2005\projects\utiltairescpp\utiltairescpp\UtiltairesCpp.h 41 

pour la ligne : ObjetConnection =
gcnew OleDbConnection(chainedeconnexion);
Error 8 error C2440: 'return' : cannot convert from 'System::Data::OleDb::OleDbConnection ^' to 'System::Data::OleDb::OleDbConnection' c:\documents and settings\amy\mes documents\visual studio 2005\projects\utiltairescpp\utiltairescpp\UtiltairesCpp.h 50 

pour la ligne: return ObjetConnection;

Error 9 error C2664: 'System::Data::OleDb::OleDbCommand::OleDbCommand(System::String ^)' : cannot convert parameter 1 from 'std::string' to 'System::String ^' c:\documents and settings\amy\mes documents\visual studio 2005\projects\utiltairescpp\utiltairescpp\UtiltairesCpp.h 61 

pour la ligne :

OleDbCommand^ ObjetCommand =

gcnew OleDbCommand(requete);

Error 10 error C2664: 'void System::Data::Common::DbCommand::Connection::set(System::Data::Common::DbConnection ^)' : cannot convert parameter 1 from 'System::Data::OleDb::OleDbConnection' to 'System::Data::Common::DbConnection ^' c:\documents and settings\amy\mes documents\visual studio 2005\projects\utiltairescpp\utiltairescpp\UtiltairesCpp.h 63 

pour la ligne :ObjetCommand->Connection = ObjetConnection; //J'ai changé la ligne avant j'avais mis ObjetCommand.Connection

Bien sur il y a d'autres erreurs, mais bon déjà si j'arrive à comprendre celle là et à les résoudre ce sera un grand pas.
Il y a d'autres erreurs à propros des Exceptions et d'un MessageBox mais d'après moi c'est un problème de using manquant, il faut juste que je trouve lesquels.

Merci de votre aide d'avance
Maiku
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
21
Voici ce qu'on trouve dans MSDN
Il faut utiliser des pointeurs ! pour simuler les références du C#  

#using <mscorlib.dll>

using System::String;         // et pas std::string !

__gc class M {
         String s1;                 // error
         String *s2;               // ok
         String f1();               // error
         String * f2();            // ok
         void g1(String s);      // error
         void g2(String * s);   // ok
};
Messages postés
190
Date d'inscription
dimanche 10 avril 2005
Statut
Membre
Dernière intervention
4 juillet 2007

Salut

Ben quand j'ecris String *var;
Il me met une erreur;
et j'ai bien ajoutéer mscorlib en référence, mis le using System::String; et le #using <mscorlib.dll>

Maiku
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
21
Il faut aussi compiler en /CLI ou /CLR, regarde les options du linker.
Messages postés
190
Date d'inscription
dimanche 10 avril 2005
Statut
Membre
Dernière intervention
4 juillet 2007

Compiler en CLI ou CLR ca veut dire quoi ?
Je suis débutante tu sais, je commence juste à m'y mettre........

Maiku
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
21
Il faut que tu clique droit sur ton projet, dans l'arbre des fichiers (explorateur de solution) à droite, option proprietés et choisis dans le tree, editeur de lien, la tu peux mettre des option de compilation (lib, param ect...), Rajoute l'activation des extentions managed (ou regardes dans l'aide pour managed c++ 
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
21
Excuse, c'est dans 'général', active extension managées
Messages postés
190
Date d'inscription
dimanche 10 avril 2005
Statut
Membre
Dernière intervention
4 juillet 2007

Tu dis activer Extension Managées, mais je n'ai pas de cases à cocher de ce type.
En plus, j'utilise Visual Studio.Net 2005 c'est peut etre différent non ?

Maiku
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
21
En fait, rajoute simplement sur la ligne de commande de ta compilation :
/clr
As tu déjà compilé un programme à la main :
cl.exe /clr /autresoption /t:win ect...
Et bien tu peux faire la meme chose avec les options graphiques de ton projet.
Messages postés
190
Date d'inscription
dimanche 10 avril 2005
Statut
Membre
Dernière intervention
4 juillet 2007

Non je n'ai jamais compilé un programme C++ à la main , je te l'ai dit, je débute, j'essaye de faire un programme de gestion de bibliothèque et c'est pour ça que je dois manipuler les bases de données et les chaines de caractères.

Mais je vois pas ou je peux rajouter /clr dans General, en plus c'est en anglais grrrr!!!

Maiku
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
21
il ne te reste plus qu'a taper /clr ou managed c++ dans l'index de l'aide.
(appuis sur F1 pour l'aide, ou l'onglet help et find)
Messages postés
190
Date d'inscription
dimanche 10 avril 2005
Statut
Membre
Dernière intervention
4 juillet 2007

Salut

Merci yann_lo_san pour la Class System::String
J'arrive à l'utiliser, car par défaut Visual Studio.Net 2005 gere le Clr, toufefois pour utiliser String , je dois déclarer de la façon suivante :

String^ var = gcnew String("");
(donc je dois pas utiliser le * )

Sinon au sujet de la Bibliothèque de Classe BasedeDonnées, etc.
J'ai réussi à la réadapter de C# à C++, je mettrais le code concernant la BasedeDonnées, une fois que les dernières erreurs seront corrigées, en tant que source, car ça peut en intéresser certains.

Par Contre, dernier problème, je n'arrive pas à me connecter à la base de données , c'est le provider qui bloque, quand j'affiche ce qu'il contient , j'ai une petite idée du prob, je verrais, et vous tiendrais au courant ce soir.

Maiku
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
21
Et oui, j'utilise VStudio 2003 et apparemment c'est bien different...
Va falloir que je me mette à la derniere version.
Alors bonne continuation Maiku.
Messages postés
190
Date d'inscription
dimanche 10 avril 2005
Statut
Membre
Dernière intervention
4 juillet 2007

Salut

Alors j'ai toujours le problème avec le provider, je sais où est le problème mais comment le résoudre reste un mystère :

Voici la méthode extraire de ma bibliothèque de Classe BasedeDonnees :

OleDbConnection^ ConnectionOleDb(String^ Bd)

{

//Preparation de la Connexion à la Base de DonnéesOleDbConnection^ ObjetConnection =

gcnew OleDbConnection();

//On tente d'accèder à la base de données

//Chaîne de Connexion à la BaseString^ PiloteOleDb =

gcnew String(
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=");String^ chainedeconnexion =

gcnew String(
"");chainedeconnexion =

"@"+PiloteOleDb+Bd;MessageBox::Show(chainedeconnexion);

ObjetConnection =

gcnew OleDbConnection(chainedeconnexion);

//Ouverture de la Connection avec Access sur la Base de DonnéesObjetConnection->Open();

return ObjetConnection;}

Voila la Façon dont je l'utilise dans mon programme :

public

: BasedeDonnees bd;

public: OleDbDataReader^ myReader;

public: OleDbConnection^ Connection;
Connection = this->bd.ConnectionOleDb(
"Biblio.mdb");

Quand j'affiche ce que contient le provider , voila ce qu'il me repond :

@Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Biblio.mdb

En sachant que ma Base de Donnees(Access) est dans :

Mes Documents\Mes Programmes\GestionBiblio\debug\Biblio.mdb

Voila, je voudrais savoir ce qui cloche T_T
J'espère que vous pourrez m'aider.

Maiku

PS : yann_lo_san, vi c'est peut etre la version de Visual Studio.Net qui a des changements en 2005.