OleDB : UPDATE d'un champ Oui/Non provoque une erreur

Messages postés
171
Date d'inscription
vendredi 1 septembre 2006
Statut
Membre
Dernière intervention
14 novembre 2019
- - Dernière réponse : MGD Software
Messages postés
171
Date d'inscription
vendredi 1 septembre 2006
Statut
Membre
Dernière intervention
14 novembre 2019
- 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 ?
Afficher la suite 

3 réponses

Messages postés
1978
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
2 décembre 2019
77
0
Merci
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

if (chkAutoris.Checked)
    Cmd.Parameters.AddWithValue("autor", -1); // true
else
    Cmd.Parameters.AddWithValue("autor", 0); // false


sous toute réserve j'ai très peu pratiqué Access !
Commenter la réponse de vb95
Messages postés
171
Date d'inscription
vendredi 1 septembre 2006
Statut
Membre
Dernière intervention
14 novembre 2019
0
Merci
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.

Merci pour le conseil.
Commenter la réponse de MGD Software
Messages postés
171
Date d'inscription
vendredi 1 septembre 2006
Statut
Membre
Dernière intervention
14 novembre 2019
0
Merci
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.

Je craque...

Je vais donc garder ma solution "annexe".

Merci quand même.
Commenter la réponse de MGD Software