Portée des variables

Signaler
Messages postés
20
Date d'inscription
lundi 16 mai 2005
Statut
Membre
Dernière intervention
29 juillet 2005
-
Messages postés
20
Date d'inscription
lundi 16 mai 2005
Statut
Membre
Dernière intervention
29 juillet 2005
-
Bonjour,
voila mon code :

void BindGrid(){
// selection des jours feries de l'annee voulue
SqlCommand selection = new SqlCommand("SELECT * FROM jours_feries" +
" WHERE jf_date >= '01/01/" + anneecourante + "'" +
" AND jf_date <= '31/12/" + anneecourante + "'"+
" ORDER BY jf_date",
connexion
);
try{
connexion.Open();
SqlDataReader dr = selection.ExecuteReader();


GrilleJours.DataSource = dr;
GrilleJours.DataMember = "jours_feries";
GrilleJours.DataBind();
}
finally{
dr.Close();
connexion.Close();
}
}

Voila mon probleme :

Compiler Error Message: CS0246: The type or namespace name 'dr' could not be found (are you missing a using directive or an assembly reference?)

Source Error:


Line 52:     	}
Line 53:     	finally{
Line 54:     		dr.Close();
Line 55:     		connexion.Close();
Line 56:     	}



Est-ce un probleme de portée de variable ?
Ce n'est pas la premiere fois que ca m'arrive entre les try et les catch...
Please, Help

6 réponses

Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
28
Oui, le problème est bien une porté de variable, quand tu declares une variable elle est valable dans la boucle ou tu la declares, donc la dans le try, or t'as une erreur dans ton try, donc il va passer au catch, et dans ton catch, tu lui demande de fermer dr, alors qu'il n'existe pas encore, la bonne syntaxe est :


void BindGrid(){
// selection des jours feries de l'annee voulue
SqlCommand selection = new SqlCommand("SELECT * FROM jours_feries" +
" WHERE jf_date >= '01/01/" + anneecourante + "'" +
" AND jf_date <= '31/12/" + anneecourante + "'"+
" ORDER BY jf_date",
connexion
);
SqlDataReader dr;
try{
connexion.Open();
dr = selection.ExecuteReader();


GrilleJours.DataSource = dr;
GrilleJours.DataMember = "jours_feries";
GrilleJours.DataBind();
}
finally{
// avant de le fermer regarder s'il est bien ouvert, si le truc plante à l'ouverture (ce qui etait le cas, il va planter car tu vas essayer de fermer qqchose de pas ouvert), en gros tu rajoute un try sur le open, et tu geres cette erreur, plutot qu'une erreur générique
dr.Close();
connexion.Close();
}
}



<HR>



Cyril - MCP ASP.net
Webmaster de : Hoshimi.CodeS-SourceS.fr
Messages postés
20
Date d'inscription
lundi 16 mai 2005
Statut
Membre
Dernière intervention
29 juillet 2005

je viens d'essayer et maintenant j'ai :

Compiler Error Message: CS0165: Use of unassigned local variable 'dr'

Ce qui est logique. Le probleme c'est que pour resoudre le probleme, il faudrait que je place ca :
dr = selection.ExecuteReader();
en dehors du try, mais cette fonction pourrait me balacer une exception (enfin je pense parceque j'ai pas bien compris ce que faisait exactement cette fonction).
Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
28
le ExecuteReader sert à faire la requete sur la base.
Par contre le problème est que tu ne geres pas correctement les exceptions, si c'est connexion.Open(); qui plante, dr selection.ExecuteReader(); ne sera pas executé, donc dr null, et tu pourras pas appeller l'event close a qqchose qui n'existe pas ...

Donc gere mieux les exceptions et tout les cas possibles, car la ce qui plante c'est ton finally, tu essayes de fermer des trucs qui ne sont pas ouvert ou qui n'existe encore pas.


<HR>
Cyril - MCP ASP.net
Webmaster de : Hoshimi.CodeS-SourceS.fr
Messages postés
20
Date d'inscription
lundi 16 mai 2005
Statut
Membre
Dernière intervention
29 juillet 2005

qu'est ce que tu me conseil ? des try-catch separes pour chaque truc qui peut balancer une exception ? c'est un peu trash non?
Messages postés
586
Date d'inscription
lundi 7 janvier 2002
Statut
Membre
Dernière intervention
10 février 2010
1
.......
SqlDataReader dr = new SqlDataReader;
try{
connexion.Open();
dr = selection.ExecuteReader();
GrilleJours.DataSource = dr;
GrilleJours.DataMember = "jours_feries";
GrilleJours.DataBind();
}
finally{
if dr.IsOpen(){ <- me souviens plus du nom de cette méthode, mais elle existe.
dr.Close();
}
connexion.Close();
}
}

et tu devrais ajouter des blocks catch....

yopyop
Messages postés
20
Date d'inscription
lundi 16 mai 2005
Statut
Membre
Dernière intervention
29 juillet 2005

Desole mais ca marche pas : le contructeur
SqlDataReader dr = new SqlDataReader;
n'existe pas. d'ailleur je trouve pas de constructeur correct a part avec un SqlCommand donc c'est un peu inutile!
Je reste donc avec mon probleme dont je n'arrive pas a trouver de solution. C'est la folie quand meme !