Portée des variables

DeitY51 Messages postés 20 Date d'inscription lundi 16 mai 2005 Statut Membre Dernière intervention 29 juillet 2005 - 20 mai 2005 à 14:38
DeitY51 Messages postés 20 Date d'inscription lundi 16 mai 2005 Statut Membre Dernière intervention 29 juillet 2005 - 24 mai 2005 à 09:18
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

jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
20 mai 2005 à 14:43
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
0
DeitY51 Messages postés 20 Date d'inscription lundi 16 mai 2005 Statut Membre Dernière intervention 29 juillet 2005
20 mai 2005 à 15:07
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).
0
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
20 mai 2005 à 15:46
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
0
DeitY51 Messages postés 20 Date d'inscription lundi 16 mai 2005 Statut Membre Dernière intervention 29 juillet 2005
20 mai 2005 à 15:52
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?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Yopyop Messages postés 586 Date d'inscription lundi 7 janvier 2002 Statut Membre Dernière intervention 10 février 2010 1
21 mai 2005 à 14:15
.......
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
0
DeitY51 Messages postés 20 Date d'inscription lundi 16 mai 2005 Statut Membre Dernière intervention 29 juillet 2005
24 mai 2005 à 09:18
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 !
0
Rejoignez-nous