OVH Cloud OVH Cloud

propriétés de classes: différents comportements !

6 réponses
Avatar
Akades
Bonjour, bonsoir,

Voici le basique code d'une propriété qui marche :

public string SelectCommandText {
get{return _select_command_text;}
set{
if(_select_command_text!=value) {
_select_command_text=value;
}
}
}

Pas de problème majeur si ce n'est qu'elle à besoin d'être étoffée pour
vérifier le contenu de la commande select. Avec ce code mon programme
tourne bien et fait ce que j'attends de lui tant que la commande est bien
une commande sql valide de type select.

Maintenant si j'étoffe le code pour vérifier la validité ca ne marche plus.

public string SelectCommandText {
get{return _select_command_text;}
set{
if(_select_command_text!=value) {
_select_command_text=ValidateSelectCommand(value);
}
}
}

private string ValidateSelectCommand(string s) {
string vc = ""; // Validated command
int p = s.IndexOf(" ");
string clause = s.Substring(0, p);

if((clause=="select" || clause=="show") && _command_type=CommandType.Query)
{
vc = s;
} else if((clause!="select" && clause!="show") &&
_command_type=CommandType.Table) {
vc = "select * from "+s;
} else {
vc="";
throw new DataSetException("Neither a select query or table name !");
}

return vc;
}

La fonction de vérification est complète mais si je mets ne serait-ce qu'une
ligne ca plante quand même. Par contre si j'assigne directement s à vc, ça
marche à nouveau.

private string ValidateSelectCommand(string s) {
string vc=s;

/*
code de vérification en commentaire ...
*/

return vc;
}

Question : Pourquoi la moindre ligne de code intermédiaire fait tout
planter ?

Remarque : Ca ne plante pas réellement (pas de message) mais le programme ne
se déroule pas comme prévu.

Merci d'avance

David.

6 réponses

Avatar
Akades
Akades wrote:

Sinon ça, ça marche ... pas non-plus :

public string SelectCommandText {
get{return _select_command_text;}
}

private void ValidateSelectCommand(string s) {
string vc = ""; // Validated command
int p = s.IndexOf(" ");
string clause = s.Substring(0, p);

if((clause=="select" || clause=="show") && _command_type=CommandType.Query
{
vc = s;
} else if((clause!="select" && clause!="show") &&
_command_type=CommandType.Table) {
vc = "select * from "+s;
} else {
throw new DataSetException("Neither a select query or table name !");
}

_select_command_text = vc;
}

Mais bien-entendu ça, ça marche :

public string SelectCommandText {
get{return _select_command_text;}
}

private void ValidateSelectCommand(string s) {
string vc = s; // Validated command
_select_command_text = vc;
}

Je pige pas tout ! :(

@++
Avatar
Messenger of the red snake mountain
> Question : Pourquoi la moindre ligne de code intermédiaire fait tout
planter ?

Remarque : Ca ne plante pas réellement (pas de message) mais le programme ne
se déroule pas comme prévu.



Bonjour,

Etes-vous vraiment certain du bon fonctionnement de votre méthode
ValidateSelectCommand ? Je me concentrerais là dessus.

J'ai peut être mal lu mais il me semble qu'un test de flux (aucune fonctionnalité
supplémentaire) n'a pa été cité:

*: notez l'utilisation de 'this' pour être certain qu'il se refère à l'instance
courante
------------------------------------------------------------------
public string SelectCommandText
{
get{return this._select_command_text;}
set
{
if(this._select_command_text!=value)
{
this._select_command_text=ValidateSelectCommand(value);
}
}
}

private string ValidateSelectCommand(string s)
{
return("VALID" + s); //avec ça, on est certain que cela marche
}
------------------------------------------------------------------

Si ce test fonctionne, on aura déjà isolé le problème: il vient de l'implémentation
de ValidateSelectCommand. Sinon..... on envisagera une plus longue
réflexion ; )

.antoine




--




------------oOoo---Ôô----ooOo---------------------------
Antonio FONTES (well, me, actually)
http://www.nxtg.net/saphyr/ (tout et rien en français)
http://www.nxtg.net/is/ (blog - développeur web)
E-mail:
-------------------------------------------------------------
Avatar
Drakkhen
Bonjour, il faudrait etre sur du code dans ValidateSelectCommand.

Par exemple, je ne comprends pas que ceci puisse compiler dans une clause if
!
_command_type=CommandType.Query

((clause=="select" || clause=="show") && _command_type=CommandType.Query)

Il faudrait 2 "=" et pas un seul.

De plus, si j'ecris
SeLect * FROM MaTable;
Alors cela ne passera pas simplement a cause de la casse des caracteres.

Y a d'autres cas plus tordus du genre:

select * FROM MaTable; SELECT * FROM MaTable2;

Qui apparemment sera accepte alors que cela devrait etre refuse.

Etc...


--
Drakkhen

http://michael.moreno.free.fr/


"Akades" wrote in message
news:4158a807$0$12143$
Bonjour, bonsoir,

Voici le basique code d'une propriété qui marche :

public string SelectCommandText {
get{return _select_command_text;}
set{
if(_select_command_text!=value) {
_select_command_text=value;
}
}
}

Pas de problème majeur si ce n'est qu'elle à besoin d'être étoffée pour
vérifier le contenu de la commande select. Avec ce code mon programme
tourne bien et fait ce que j'attends de lui tant que la commande est bien
une commande sql valide de type select.

Maintenant si j'étoffe le code pour vérifier la validité ca ne marche
plus.

public string SelectCommandText {
get{return _select_command_text;}
set{
if(_select_command_text!=value) {
_select_command_text=ValidateSelectCommand(value);
}
}
}

private string ValidateSelectCommand(string s) {
string vc = ""; // Validated command
int p = s.IndexOf(" ");
string clause = s.Substring(0, p);

if((clause=="select" || clause=="show") &&
_command_type=CommandType.Query)
{
vc = s;
} else if((clause!="select" && clause!="show") &&
_command_type=CommandType.Table) {
vc = "select * from "+s;
} else {
vc="";
throw new DataSetException("Neither a select query or table name !");
}

return vc;
}

La fonction de vérification est complète mais si je mets ne serait-ce
qu'une
ligne ca plante quand même. Par contre si j'assigne directement s à vc, ça
marche à nouveau.

private string ValidateSelectCommand(string s) {
string vc=s;

/*
code de vérification en commentaire ...
*/

return vc;
}

Question : Pourquoi la moindre ligne de code intermédiaire fait tout
planter ?

Remarque : Ca ne plante pas réellement (pas de message) mais le programme
ne
se déroule pas comme prévu.

Merci d'avance

David.




Avatar
Akades
Messenger of the red snake mountain wrote:

Si ce test fonctionne, on aura déjà isolé le problème: il vient de
l'implémentation de ValidateSelectCommand. Sinon..... on envisagera une
plus longue réflexion ; )

.antoine



Ca ne marche pas plus.

Dorénavant, j'utilise la méthode indiquée dans mon second post. A savoir une
propriété en lecture seule et une méthode pour simuler le Set de la
propriété. Et c'est toujours aussi étrange.

// Champ privé à la classe
private string _select_command_text = "";

// Propriété en lecture seule
public string SelectCommandText {get{return this._select_command_text;}}

// Méthode simulant le Set qui fonctionne
pulbic void SetSelectCommand(string s) {
string vc = "";

int p = s.IndeOf(" ");

//suite du code en commentaire

vc = s;

this._select_command_text = vc;
}

// Méthode simulant le Set qui ne fonctionne pas
pulbic void SetSelectCommand(string s) {
string vc = "";

int p = s.IndeOf(" ");
string clause = s.Substring(0, p);

//suite du code en commentaire

vc = s;

this._select_command_text = vc;
}

Je continue à chercher ...

@++
Avatar
Akades
Drakkhen wrote:

Bonjour, il faudrait etre sur du code dans ValidateSelectCommand.

Par exemple, je ne comprends pas que ceci puisse compiler dans une clause
if !



C'est parce qu'il n'y a pas la faute dans mon code !
Désolé j'ai retapé à la mano au lieu de copier/coller donc cette erreur
s'est glissée dedans. Mais ca doit être la seule.

De plus, si j'ecris
SeLect * FROM MaTable;
Alors cela ne passera pas simplement a cause de la casse des caracteres.



Pas de problème de ce côté tout est en minuscule.

Merci quand même
Avatar
Akades
Akades wrote:

Voici le bon code pour une propriété en lecture/écriture.
J'ai juste testé si p>0 avant d'assigner la variable clause.
Et le plus important, vc = value dans les deux cas testés. Dans tous les
autres cas je lance une exception.

public string SelectCommandText {
get{return _select_command_text;}
set{
if(_select_command_text!=value) {
int p = value.IndexOf(" ");
string vc = "";
string clause = "";
if(p>0) clause = value.Substring(0, p);
if((clause=="select" || clause=="show")
&& _command_type==CommandType.Query) {
vc=value;
} else if ((clause!="select" && clause!="show")
&& _command_type==CommandType.Table) {
vc=value;
} else {
throw new DataSetException("Neither a select query or
table !");
}
_select_command_text = vc;
}
}
}

Merci quand même :)

@++