OleDB : UPDATE d'un champ Oui/Non provoque une erreur
MGD Software
Messages postés193Date d'inscriptionvendredi 1 septembre 2006StatutMembreDernière intervention23 avril 2022
-
13 août 2019 à 12:23
MGD Software
Messages postés193Date d'inscriptionvendredi 1 septembre 2006StatutMembreDernière intervention23 avril 2022
-
16 août 2019 à 19:31
Bonjour,
Encore une bizarrerie avec OleDB accédant à une base Access:
J'ai une requête qui met à jour une table dans laquelle un champ est booléen.
Tout va bien lorsqu'on le passe à True.
Mais lorsqu'on le passe à False, j'ai une exception "Type de données incompatible dans l'expression du critère."
Code :
Sql = "UPDATE T_Autorisations SET [Menu]=@menu, [Statut_ID]=@ID, [Autor]=@autor WHERE Autoris_ID=@autorid";
Cmd = new OleDbCommand(Sql, Common.gCnx);
Cmd.Parameters.AddWithValue("autorid", AutorID);
Cmd.Parameters.AddWithValue("menu", MenuKey);
Cmd.Parameters.AddWithValue("ID", CatID);
if (chkAutoris.Checked)
Cmd.Parameters.AddWithValue("autor", true);
else
Cmd.Parameters.AddWithValue("autor", false);
Ne vous étonnez pas des deux lignes du paramètre "autor", c'est provisoire pour pouvoir donner à la valeur du champ différentes valeurs.
J'ai essayé avec DBNull.value à la place de false, ça ne provoque plus d'erreur mais le champ n'est pas mis à jour.
J'ai eu beau chercher sur le Web, tous les exemples emploient false sans poser de problème. J'ai eu beau relire mon code à la recherche d'une erreur de paramètre, je n'ai rien trouvé d'anormal. D'ailleurs, cela fonctionne avec True.
Quelqu'un a une idée ?
A voir également:
OleDB : UPDATE d'un champ Oui/Non provoque une erreur
vb95
Messages postés3407Date d'inscriptionsamedi 11 janvier 2014StatutContributeurDernière intervention24 mars 2023165 16 août 2019 à 18:19
Bonjour
Peut-être vous mettre sur une piste : http://www.info-3000.com/access/cours/lecon09/lecon09.php Car je me rappelle que les champs Oui/Non Access sont représentés par des valeurs numériques comme le souligne le lien fourni plus haut
Faux est représenté par 0
Vrai est représenté par -1 ( en vérité toute valeur différente de 0 )
Ce qui donnerait ce code pour être en adéquation avec Access au niveau de la base de données
MGD Software
Messages postés193Date d'inscriptionvendredi 1 septembre 2006StatutMembreDernière intervention23 avril 20222 16 août 2019 à 19:13
C'est vrai, je n'ai pas essayé ça.
En VB6, vrai valait -1 et faux 0. Il n'y avait pas de problème.
En C#, vrai vaut 1, mais faux équivaut à null ou une chaine nulle.
Je vais essayer les valeurs 0 et 1 (ou plutôt -1)
C'est bête, mon appli est quasi finie, j'avais trouvé une solution annexe : supprimer l’enregistrement et le recréer sans fournir de paramètre pour la valeur booléenne si elle vaut faux. C'est tordu car cela demande 2 requêtes, mais ça marche.
Je vais quand même retoucher mon code, dans un souci d'optimisation (en gardant en réserve la solution actuelle).
Je donnerai le résultat.
Le moteur d'Access (Jet) est resté en 16 bits (oledb ne fonctionne pas en 32 bits, en tous cas la version 4.0 avec laquelle je travaille) et je pense qu'il est resté compatible avec VB6, qui est encore son langage de macros.
MGD Software
Messages postés193Date d'inscriptionvendredi 1 septembre 2006StatutMembreDernière intervention23 avril 20222 16 août 2019 à 19:31
Hélas, 3 fois Hélas !
J'ai essayé la solution 0 / -1, mais pour 0 j'ai toujours l'erreur "Type de données incompatible dans l'expression du critère."
Normal, on passe au moteur de base de données une valeur numérique alors qu'il attend un booléen. Le C# est très chatouilleux sur les types de variable.
J'ai même essayé "(bool)0", mais là c'est le compilateur qui râle.