Probleme avec les Bases de Données, Requetes,etc

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
-
Bonjour

Actuellement je developpe un logiciel de recettes de cuisine, tout fonctionnait bien lorsque je me suis rendu compte qu'elle ne gerée des requetes qui ne demandait qu'une colonne et pas plusieurs.
Mon programme tel qu'il est actuellement me permet de faire toutes mes requetes : SELECT FROM WHERE,INSERT INTO, DELETE,UPDATE.
Alors Voila une bibliothèque de classe, un dll si vous preferez,c'est elle qui contient tout mes declarations pour les access a la base de donnees et les requetes :

//Preparation de la Connexion à la Base de Données
OleDbConnection ObjetConnection = new OleDbConnection();
OleDbDataReader myReader = null; //lecteur de Données


//On tente d'accèder à la base de données
//Chaîne de Connexion à la Base
string chainedeconnexion = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=CuisinonsSimple.mdb";
ObjetConnection = new OleDbConnection(chainedeconnexion);
//Ouverture de la Connection avec Access sur la Base de Données
ObjetConnection.Open();
//Execution d'une Requete SQL
OleDbCommand ObjetCommand = new OleDbCommand(requete);


ObjetCommand.Connection = ObjetConnection;
myReader = ObjetCommand.ExecuteReader();



if(myReader == null)
{
resultat.Add("Aucun Résultat Trouvé");
}
while (myReader.Read())
{
string ligne="";
for(i=0;i<myReader.FieldCount;i++)
{
ligne=myReader[i]+"";
}
resultat.Add(ligne);
}
return resultat;

J'ai essayé de me renseigner un peu partout sur ce que veulent dire les commandes, je ne comprend pas encore très bien.
Le DataReader est un accès en lecture seul d'après ce que je sais donc je ne vois pas pk il refuse de me faire des requetes sur plusieurs colonnes.

Voici un Exemple de requetes que je fais dans mon programme principal, je precise que bd est un public BasedeDonneeAccess bd = new BasedeDonneeAccess() qui correspond à ma bilibothèque de classe, dont je ne passe en parametre que la requete.


this.result=bd.Connection("Select Count(*) From Recettes");



foreach(
string valeur
in result)


{



this.Nb.Text =valeur;


}



this.result.Clear();



this.result = bd.Connection("Select NomF From Famille");



foreach(
string valeur
in result)


{



this.Famille.Items.Add(valeur);


}



this.result.Clear();



PS : Resultat est un Tableau dynamique ArrayList.

Quelqu'un saurait-il m'expliquer pourquoi je ne peux pas faire de requete du type select nom,details from recettes , que je ne peux faire que des select ou autres requetes sur un champ ? Comment modifier cela sinon ?

Merci d'Avance
PS : Expliquez svp les solutions que vous apportées car je suis encore debutante en c#, est ce que qq connait une commande pour neutraliser les caractères speciaux tel que les apostrophes ?

Maiku
Merci

17 réponses

Messages postés
540
Date d'inscription
dimanche 29 décembre 2002
Statut
Modérateur
Dernière intervention
13 mai 2011

Pour ta question n°1, consulte ça : http://www.codeproject.com/dotnet/adonet_datareader.asp.
Ensuite pour enlever les apostrophes des chaines, utilise la focntion Replace de la classe String.

Poppyto http://www.poppyto.net LE site pour les bassistes
http://blogs.developpeur.org/Poppyto Mon Blog sur C#
Messages postés
190
Date d'inscription
dimanche 10 avril 2005
Statut
Membre
Dernière intervention
4 juillet 2007

Pour la question du DataReader, c'est bon je l'ai réglé.
Mais pour la fonction Replace, je me suis renseigné mais je ne sais pas si elle correspond à mon cas, je m'explique:
Le code d'Ajout d'une recette dans ma base de données comporte un nomrecette et un detailsrecette, l'ajout plante si il y a des apostrophes dans ce que l'utilisateur a marqué.

Actuellement j'utilise le code suivante :

if(this.FamilleA.SelectedIndex<0 && this.IngredientsA.SelectedIndex<0 && this.NomR.Text!="" && this.DetailsA.Text!="")


{


MessageBox.Show("Vous ne pouvez ajouter une recette sans avoir précisé les ingrédients qui le compose","Attention",MessageBoxButtons.OK,MessageBoxIcon.Error);


}


else


{


lecteur = bd.Connection("Select NomRecette From Recettes " + " where NomRecette='"+this.NomR.Text+"'");


if(lecteur==null)


{


lecteur bd.Connection("SELECT RefI From Ingrédients" + " WHERE NomI'"+IngredientsA.SelectedItem+"'");


string numing = OneResult(lecteur);


bd.Connection("INSERT INTO Recettes(NomRecette,Details,RefI)" + " VALUES('"+this.NomR.Text+"','"+this.DetailsA.Text+"','"+numing+"') ");


MessageBox.Show("Recette ajoutée avec success","Opération Réussie",MessageBoxButtons.OK,MessageBoxIcon.Information);


this.Close();


}


else


{


MessageBox.Show("Une Recette est Unique.Le Nom que vous avez choisi pour votre recette existe deja dans la base de donnée","Impossible d'Ajouter",MessageBoxButtons.OK,MessageBoxIcon.Error);


}


}



lecteur etant un DataReader.
Comment utiliser la fonction Replace dans ses conditions ?

Merci d'avance
Maiku
Messages postés
540
Date d'inscription
dimanche 29 décembre 2002
Statut
Modérateur
Dernière intervention
13 mai 2011

Tu peux stocker les propiétés .Text des champs dans des variables "string" puis effectuer le remplacement.

Exemple 1 :

string Nom= this.NomR.Text;
Nom = Nom.Replace("'","\'");

string Details = this.DetailsA.Text;
Details = Details.Replace("'","\'");

bd.Connection("INSERT INTO Recettes(NomRecette,Details,RefI)" + " VALUES('"+Nom+"','"+Details+"','"+numing+"') ");

Poppyto http://www.poppyto.net LE site pour les bassistes
http://blogs.developpeur.org/Poppyto Mon Blog sur C#
Messages postés
190
Date d'inscription
dimanche 10 avril 2005
Statut
Membre
Dernière intervention
4 juillet 2007

Alors j'ai modifié mon code, mais voila qu'un autre probleme survient :


if(this.FamilleA.SelectedIndex<0 && this.IngredientsA.SelectedIndex<0 && this.NomR.Text!="" && this.DetailsA.Text!="")


{


MessageBox.Show("Vous ne pouvez ajouter une recette sans avoir précisé les ingrédients qui le compose","Attention",MessageBoxButtons.OK,MessageBoxIcon.Error);


}


else


{ lecteur=null;


lecteur = bd.Connection("Select NomRecette From Recettes " + " where NomRecette='"+this.NomR.Text+"'");


//Il s'agit de verifier si le nom de la recette a ajouter n'existe pas deja dans la bd, s'il n'y a aucun recette identique, le lecteur est sensé renvoyé null, mais il ne rentre pas dans le if mais ds le else ce qui n'est pas logique.

if(lecteur==null)


{


lecteur bd.Connection("SELECT RefI From Ingrédients" + " WHERE NomI'"+IngredientsA.SelectedItem+"'");


string numing = OneResult(lecteur);


string Nom= this.NomR.Text;


Nom = Nom.Replace("'","\'");


string Details = this.DetailsA.Text;


Details = Details.Replace("'","\'");


bd.Connection("INSERT INTO Recettes(NomRecette,Details,RefI)" + " VALUES('"+Nom+"','"+Details+"','"+numing+"') ");


MessageBox.Show("Recette ajoutée avec success","Opération Réussie",MessageBoxButtons.OK,MessageBoxIcon.Information);


this.Close();


}


else


{


MessageBox.Show("Une Recette est Unique.Le Nom que vous avez choisi pour votre recette existe deja dans la base de donnée","Impossible d'Ajouter",MessageBoxButtons.OK,MessageBoxIcon.Error);


while(lecteur.Read())


{


MessageBox.Show("la valeur ds le tale est"+lecteur.GetValue(0));


}


}

Qu'est ce qui cloche dans mon code ? Et pourquoi remplacer les apostrophes par des ' comment le traduit le programme ?

Merci d'Avance
Maiku
Messages postés
540
Date d'inscription
dimanche 29 décembre 2002
Statut
Modérateur
Dernière intervention
13 mai 2011

Oupps j'ai oublié un slash :)
En csharp tu peux ajouter l'antislash \ de deux manière (c'est un caractère spécial en fait)
Details Details.Replace("'",\"); //double slash un slash en fait
Details = Details.Replace("'",@"\'"); // l'arobase permet d'insérer un seul slash sans se soucier des conventions.

Ca devrait mieux marcher :)

Les apostrophes ' sont remplacés par des \' car sinon on peut effectuer des injections dans ton code sql.
Imagine qu'un utilisateur rentre dans un champ TextBox son pseudo :
dede'; DROP Recettes;--

Une de tes requetes pourrait alors se transformer en :
SELECT * FROM Recettes WHERE Pseudo = 'dede'; TRUNCATE TABLE Recettes;-- '

Essaye de trouver ce qui se passe dans ce cas là (n'execute pas la requete par pitié ! )

Poppyto http://www.poppyto.net LE site pour les bassistes
http://blogs.developpeur.org/Poppyto Mon Blog sur C#
Messages postés
190
Date d'inscription
dimanche 10 avril 2005
Statut
Membre
Dernière intervention
4 juillet 2007

Vi j'ai fait les modifs mais comme je te disais impossible d'ajouter car il ne rentre pas dans la bonne condition

Maiku
Messages postés
540
Date d'inscription
dimanche 29 décembre 2002
Statut
Modérateur
Dernière intervention
13 mai 2011

Il faut que tu encadre tes VALUES entre simples apostrophes :
INSERT INTO Table(Col1,Col2) VALUES ('value1','val\'ue2');

Ainsi c'est possible d'ajouter des apostrophes

Poppyto http://www.poppyto.net LE site pour les bassistes
http://blogs.developpeur.org/Poppyto Mon Blog sur C#
Messages postés
190
Date d'inscription
dimanche 10 avril 2005
Statut
Membre
Dernière intervention
4 juillet 2007

Lol t'as pas compris, c'est pas ça qui gene, lui il n'entre pas dans la bonne condition, il entre dans :


else


{


MessageBox.Show("Une Recette est Unique.Le Nom que vous avez choisi pour votre recette existe deja dans la base de donnée","Impossible d'Ajouter",MessageBoxButtons.OK,MessageBoxIcon.Error);


while(lecteur.Read())


{


MessageBox.Show("la valeur ds le tale est"+lecteur.GetValue(0));


}


}

il n'entre pas dans la condition si lecteur==null.

Maiku
Messages postés
540
Date d'inscription
dimanche 29 décembre 2002
Statut
Modérateur
Dernière intervention
13 mai 2011

Je pense que ton code marche bien mais que tu as fait une mauvaise interprétation. A mon avis quand ça renvoie null, c'est que la requête a un problème de syntaxe. Autrement la requête a marché et il se peut qu'il n'y ai aucune ligne de retourné, donc vérifie le nombre de lignes renvoyées.

J'ai la flemme de vérifier ce que j'avance mais je pense que ça vient de là .

Poppyto http://www.poppyto.net LE site pour les bassistes
http://blogs.developpeur.org/Poppyto Mon Blog sur C#
Messages postés
190
Date d'inscription
dimanche 10 avril 2005
Statut
Membre
Dernière intervention
4 juillet 2007

Alors maintenat j'entre dans la condition mais c'est au niveau des apostrophe que ca va tjrs pas, il dit qu'il y a un opérateur absent.

Comme par hasard.

Maiku
Messages postés
540
Date d'inscription
dimanche 29 décembre 2002
Statut
Modérateur
Dernière intervention
13 mai 2011

On va y arriver Ca devrait mieux se passer comme cela (corrige les fautes de syntaxe au cas où j'ai rippé) :

string RequeteSelect = string.Format("SELECT RefI From Ingrédients WHERE NomI='{0}'",
IngredientsA.SelectedItem);

lecteur = bd.Connection(RequeteSelect);


string numing = OneResult(lecteur);
string Nom= this.NomR.Text.Replace("'","\'");
string Details = this.DetailsA.Text.Replace("'","\'");

string RequeteInsert = string.Format("INSERT INTO Recettes(NomRecette,Details,RefI) " +,
"VALUES('{0}','{1}','{2}'",
Nom,Details,numing );


Details = Details.bd.Connection(RequeteInsert);


MessageBox.Show("Recette ajoutée avec success","Opération Réussie",MessageBoxButtons.OK,MessageBoxIcon.Information);


this.Close();

Poppyto http://www.poppyto.net LE site pour les bassistes
http://blogs.developpeur.org/Poppyto Mon Blog sur C#
Messages postés
190
Date d'inscription
dimanche 10 avril 2005
Statut
Membre
Dernière intervention
4 juillet 2007

NomI='{0}'",
"VALUES('{0}','{1}','{2}'",

Ca veut dire quoi ces trucs ?

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

string RequeteInsert = string.Format("INSERT INTO Recettes(NomRecette,Details,RefI) " +,
"VALUES('{0}','{1}','{2}'",
Nom,Details,numing );

Et cette requete en elle même, que signifie string.Format, concretement qu'est ce que ca fait ?

Maiku
Messages postés
540
Date d'inscription
dimanche 29 décembre 2002
Statut
Modérateur
Dernière intervention
13 mai 2011

Un exemple vaut mieux qu'un long discours :

string reponse = string.Format("{0} {1} {2} , {2} {1} {3}",
"comment","vas","tu","bien");

reponse est alors egal à = "comment vas tu , tu vas bien";
Pratique n'est-ce pas ?

Poppyto http://www.poppyto.net LE site pour les bassistes
http://blogs.developpeur.org/Poppyto Mon Blog sur C#
Messages postés
190
Date d'inscription
dimanche 10 avril 2005
Statut
Membre
Dernière intervention
4 juillet 2007

Ok, je crois que je pense avoir compris mais pk dire :


Details = Details.bd.Connection(RequeteInsert);

ca ne peut pas marcher, car pour effectuer la requete il faut obligatoirement utiliser lecteur qui est un OleDbDataReader, et pk faire Details.bd.Connection ?

Ps : string RequeteInsert = string.Format("INSERT INTO Recettes(NomRecette,Details,RefI) " +,
"VALUES('{0}','{1}','{2}'",
Nom,Details,numing );


Details = Details.bd.Connection(RequeteInsert);

ne fonctionne pas, le compilateur marque des erreurs de synthaxe un peu partout.

Maiku
Messages postés
540
Date d'inscription
dimanche 29 décembre 2002
Statut
Modérateur
Dernière intervention
13 mai 2011

Je me sui planté enlève le "Details = Details." c'était un copier coller un peu rapide.

Poppyto http://www.poppyto.net LE site pour les bassistes
http://blogs.developpeur.org/Poppyto Mon Blog sur C#
Messages postés
190
Date d'inscription
dimanche 10 avril 2005
Statut
Membre
Dernière intervention
4 juillet 2007

Alors plus de problème de syntaxe, de ce cote la ca passe, maitenant je lui ai dit en cas d'erreur de m'afficher ce qui n'allait pas, c'est encore un operateur absent.
Peut etre que mon exemple va t'aider, imaginons que je veuille ajouter le details de la Recette : Abricots à la Crème
avec pour Details :

Préparation: 25 minutes. Pour 6 personnes: 1/2 litre de lait, 3 jaunes d'oeufs, 40 g de farine, 150 g de sucre, 750 g d'abricots, 1 verre d'eau, 100 g de sucre en morceaux, 50 g d'amandes effilées, 1/2 verre de rhum.


Préparer une crème pâtissière: travailler les jaunes d'oeufs avec le sucre et la farine. Verser dessus le lait chaud. Faire épaissir sur feu doux. Ajouter un peu de rhum pour parfumer. Verser dans un plat allant au four. Couper en deux et dénoyauter les abricots, les faire pocher 3 minutes dans un sirop obtenu en faisant simplement bouillir l'eau et le sucre en morceaux. Egoutter les abricots. Faire réduire le sirop de moitié. Disposer les demi-abricots sur la crème, partie bombée


dessus. Parsemer des amandes effilées, arroser de sirop, faire gratiner 10 minutes à four chaud ou au gril. A la sortie du four arroser de rhum et flamber.

Y a t'il d'autres caractères a part l'apostrophe qui pourrait empecher l'ajout ?

Maiku