Ajout dans Base de Donnée Impossible

[Résolu]
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

Je developpe actuellement un logiciel de cuisine, en relation avec une base de donnee access dont le modèle logique conceptuel est le suivante :
Recettes(CodeRecette,NomRecette,Details)
Ingrédients(RefI,NomI)
Composer(CodeRecette,RefI)
Famille(RefF,NomF)

J'essaye actuellement d'ajouter une recette, ainsi que les ingredients qui la concerne,avec le code suivant :

En cliquant sur un Bouton Valider, je recupere dans un tableau ArrayList, la liste des ingrédients concernés par la recette, que l'utilisateur a selectionné :

if(this.IngredientA.Count==0)


{


i=0;


foreach (int index in this.ListIngredient.SelectedIndices)


{


ligne = ListIngredient.Items[index].ToString();


this.IngredientA.Add(ligne);


i=i+1;


}


}


else


{


MessageBox.Show("nombre element"+this.IngredientA.Count);


i = this.IngredientA.Count+1;


foreach(int index in this.ListIngredient.SelectedIndices)


{


ligne = ListIngredient.Items[index].ToString();


this.IngredientA.Add(ligne);


i=i+1;


}


}


foreach(string valeur in this.IngredientA)


{


MessageBox.Show(""+valeur);


}

En cliquant sur le bouton Ajouter , j'ajoute la recette dans la table recette, et tant qu'il y a des ingredients dans l'arraylist j'ajoute le coderecette et le refi de l'ingredient dans la table composer :


if(this.FamilleA.SelectedIndex<0 && this.ListIngredient.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.HasRows==false)


{


try


{


string Details = this.DetailsA.Text;


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


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


string ligne = OneResult(lecteur);


int nb = int.Parse(ligne);


nb = nb + 1;


bd.Connection("INSERT INTO Recettes(CodeRecette,NomRecette,Details) " + " VALUES('"+nb+"','"+Nom+"','"+Details.Replace("'","''")+"') ");


foreach(string ingredient in this.IngredientA)


{


lecteur2=bd.Connection("Select RefI From Ingrédients " + " where NomI='"+ingredient+"'");


string ligne2 = OneResult(lecteur2);


int codei = int.Parse(ligne2);


MessageBox.Show(""+codei);


bd.Connection("INSERT INTO Composer(CodeRecette,RefI) " + " VALUES('"+nb+"','"+codei+"') ");


}


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


DialogResult reponse = MessageBox.Show("Voulez vous Ajouter une Autre Recette?","Nouvelle Recette ?",MessageBoxButtons.YesNo,MessageBoxIcon.Question);


if(reponse == DialogResult.Yes)


{


this.NomR.Text="";


this.DetailsA.Text="";


this.ListIngredient.Items.Clear();


this.FamilleA.Text="";


}


else


{


this.Close();


}


}


catch(OleDbException ode)


{


MessageBox.Show(ode.ToString());


}


}


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);
}
}

Il me renvoie une erreure au niveau de mon foreach :

Une exception non gérée du type 'System.NullReferenceException' s'est produite dans system.data.dll


Informations supplémentaires : La référence d'objet n'est pas définie à une instance d'un objet.

Quelqu'un pourrait il me dire ce qui cloche dans mon code et comment le resoudre ?
Merci d'Avance

Maiku

6 réponses

Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
54
Cela pourrait en effet etre en cause.

Maintenant, va savoir ou...

ici ?

lecteur2=bd.Connection("Select RefI From Ingrédients " + " where NomI='"+ingredient+"'");


avec lecteur 2 qui serait null ?



As-tu essayé de mettre juste qques lignes de test dans ta bdd pour voir si l'erreur persiste ?


Mx
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
54
Comme ca c'est tres difficile a dire...

Quelle est cette fonction OneResult ?



Au fait, prefere les String.Format() plutot que des concatenation de chaine avec +

Exemple

lecteur2 bd.Connection(String.Format("Select refI From ingredients where NomI '{0}'", ingredient));

au lieu de

lecteur2=bd.Connection("Select RefI From Ingrédients " + " where NomI='"+ingredient+"'");

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

Rebonjour

Alors OneResult est une fonction que j'utilise lorsque je suis certaine que ma requete ne me renvoie qu'un resultat sur une seule colonne, voici son code :

static string OneResult(OleDbDataReader lect)
{
string ligne="";
if(lect != null)
{
while (lect.Read())
{
ligne = lect.GetValue(0)+"";
}
}
return ligne;
}

Si je n'utilise pas le String.Format c'est parce que je comprend plus facilement la concatenation que le String.Format plus loin {0} ,j'y comprend pas grand chose, alors je prefere une concatenation au moins je suis sur de comprendre parfaitement ce que je fais.

Maiku
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
54
Bon deja, vu que c'est System.Data.Dll qui te renvoit l'erreur, je suis
persuadé que l'erreur se trouve dans ta classe ou tu fais toutes tes
operations de base de données.

Essaie de catcher l'exception NullReferenceException dans cette classe, pour tenter d'avoir + de précisions sur l'erreur.

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

Il me renvoie l'erreure suivante :

La Reference d'Objet n'est pas définie à une instance d'un objet.
Est ce que le fait que les tables Recettes et Composer soit vide peuvent être en cause ?
Car justement je veux remplir la base de données grâce au formulaire et pas en tapant le tout dans la base de données, donc ces deux tables sont vides pour le moment.

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

Ca y est le problème est réglé, c'etait effectivement parce que la table recettes et la table composer etait vide, que cela ne marchait pas.

Merci de m'avoir éclairé
Maiku