IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bases de données Delphi Discussion :

[Firebird] Affecter une chaîne vide à un champ VARCHAR qui est NOT NULL


Sujet :

Bases de données Delphi

  1. #1
    Membre actif

    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    479
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 479
    Points : 267
    Points
    267
    Par défaut [Firebird] Affecter une chaîne vide à un champ VARCHAR qui est NOT NULL
    Bjr.
    Je cherche à affecter une chaine vide à un champ VARCHAR d'une base Firebird qui est NOT NULL.
    L'affectation d'un champ NULL par une requête du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    update TABLE set CHAMPNOTNULL=quotedstr('') where ...
    fonctionne
    En revanche
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    FieldByName('CHAMPNOTNULL').AsString='';
    affecte une valeur NULL qui déclenche une exception renvoyée par FB.
    J'ai résolu le problème par un Trigger BEFORE_INSERT et BEFORE_UPDATE mais je me demande s'il n'y aurait pas plus simple ?

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 447
    Points : 24 849
    Points
    24 849
    Par défaut
    FireBird ne propose pas un UpdateSQL que tu peux modifier ?
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    il manque quelques infos dans ta question

    quelle version de Delphi
    quelle composant BDD

    je suis assez surpris qu'un composant récent soit capable de forcer un NULL un champ qui ne l'accepte pas.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 031
    Points : 40 929
    Points
    40 929
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    Moi aussi je suis assez surpris !
    déjà le premier SQL : update TABLE set CHAMPNOTNULL=quotedstr('') where ...Outre le fait que ce code me semble incorrect , s'il y a quotedstr cela veux dire qu'il est traité dans un programme Delphi dans ce cas l'écriture en serait plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SQL.text:='update TABLE set CHAMPNOTNULL='+quotedstr('')+' WHERE ...';

    Il doit certainement y avoir une gestion d'exception quelque part car le SQL présenté ne peut pas AMHA fonctionner, par conscience j'ai quand même regardé si Firedac n'avait pas une fonction macro nommée Quotedstr
    S'il s'agit d'un SQL de type commande par exemple
    Firedac : FDConnection.ExecSQL('update TABLE set CHAMPNOTNULL=quotedstr('') where ...'); aucune erreur ne sera levée mais cela ne veut pas dire que la mise à jour sera faite

    Mais comme l'écrit Paul on n'a ni la version de Delphi, ni les composants utilisés !

    de mon point de vue ce SQL est quelque chose d'assez moche à remplacer si possible par une requête paramétrée (même s'il s'agit d'une commande ExecSQL c'est possible)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SQL.text:='update TABLE set CHAMPNOTNULL=:unnull WHERE ...';
    ParamByName('unnull').asString:='';
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  5. #5
    Membre actif

    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    479
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 479
    Points : 267
    Points
    267
    Par défaut
    Bonjour je vous dois des excuses pour la très lacunaire (et fausse) présentation du problème.
    J'utilise Delphi 7, (FireBird 2.1.3)
    Le composant est un TIBQuery
    A la conception le champ BAS_OPTION n'était pas NOT NULL. Le champ était donc à NULL quand on y avait rien placé.
    J'ai ajouté ensuite la contrainte NOT NULL. De sorte que tout UPDATE se doit de ne pas laisser ce champ NULL.
    La requête SQL d'insertion fonctionnelle est construite comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Format('Insert into MAIL_BASE (BAS_ADR,BAS_FEDE,BAS_DEP,BAS_REGION,BAS_ORIGINE,BAS_OPTION) values (%s,%s,%s,%s,%s,%s)', [QuotedStr(StringGrid1.Cells[ColAdresse,j]),QuotedStr(Edit1.text),QuotedStr(Edit2.Text),QuotedStr(Edit3.Text),QuotedStr(Edit5.Text),QuotedStr('')]);
    Elle insère dans le champ BAS_OPTION une chaine vide qui donc n'est pas NULL.
    Lorsqu'au contraire à un autre endroit du code je veux modifier une ligne de la même table j'essaie ceci dans OnClick d'un DBNavigator
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    nbPost : with IBD do begin if FieldByName('BAS_OPTION').IsNull then
                FieldByName('BAS_OPTION').AsString:='';
    IBD est un TIBDataset
    Et c'est cette instruction qui provoque une exception.
    Mettre une chaîne vide dans un champ NOT_NULL (d'un TIBDataset) ne produit pas le même effet que de mettre une value à '' dans une requête SQL.

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    566
    Détails du profil
    Informations personnelles :
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2009
    Messages : 566
    Points : 1 045
    Points
    1 045
    Par défaut
    Bonjour,

    Pour résoudre ton problème, tu peux faire l'essai suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    nbPost :
       with IBD do 
       begin
          if FieldByName('BAS_OPTION').IsNull then
             FieldByName('BAS_OPTION').AsString:= QuoteStr('');
       end;
    Je ne suis pas certain du fonctionnement et pas testé.

    Par contre, il est possible d'effectuer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    nbPost :
       with IBD do 
       begin
          if FieldByName('BAS_OPTION').IsNull then
             FieldByName('BAS_OPTION').Clear;
       end;
    Ainsi, "BAS_OPTION" sera mis à NULL et la base prendra en compte, lors de cette opération, ta valeur par défaut ('');

  7. #7
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    Citation Envoyé par frantzgac Voir le message
    Bonjour je vous dois des excuses pour la très lacunaire (et fausse) présentation du problème.
    J'utilise Delphi 7, (FireBird 2.1.3)
    Le composant est un TIBQuery
    A la conception le champ BAS_OPTION n'était pas NOT NULL. Le champ était donc à NULL quand on y avait rien placé.
    J'ai ajouté ensuite la contrainte NOT NULL. De sorte que tout UPDATE se doit de ne pas laisser ce champ NULL.
    La requête SQL d'insertion fonctionnelle est construite comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Format('Insert into MAIL_BASE (BAS_ADR,BAS_FEDE,BAS_DEP,BAS_REGION,BAS_ORIGINE,BAS_OPTION) values (%s,%s,%s,%s,%s,%s)', [QuotedStr(StringGrid1.Cells[ColAdresse,j]),QuotedStr(Edit1.text),QuotedStr(Edit2.Text),QuotedStr(Edit3.Text),QuotedStr(Edit5.Text),QuotedStr('')]);
    Elle insère dans le champ BAS_OPTION une chaine vide qui donc n'est pas NULL.
    Lorsqu'au contraire à un autre endroit du code je veux modifier une ligne de la même table j'essaie ceci dans OnClick d'un DBNavigator
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    nbPost : with IBD do begin if FieldByName('BAS_OPTION').IsNull then
                FieldByName('BAS_OPTION').AsString:='';
    IBD est un TIBDataset
    Et c'est cette instruction qui provoque une exception.
    Mettre une chaîne vide dans un champ NOT_NULL (d'un TIBDataset) ne produit pas le même effet que de mettre une value à '' dans une requête SQL.
    si tu as créé un objet TField pour ce champ, il est possible que celui-ci ne sache pas que tu as modifié la structure de la base, c'est un des aspect casse pied des TField statiques d'ailleurs.
    Si c'est le cas, tu fais un clic droit sur le TQuery pour gérer les champs (Editeurs de champs), tu supprimes et recrée le champ BAS_OPTION (ou tu regardes dans ses propriétés celle qui correspond au NOT NULL)
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  8. #8
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut
    Bonne année 2019
    Si tu veux modifier, il faudra utiliser ParamByName au lieu de FieldByName.
    Cordialement

    Andry
    On progresse .....

Discussions similaires

  1. Erreur : Le champ ne peut pas être une chaîne vide
    Par supertoms dans le forum VBA Access
    Réponses: 5
    Dernier message: 23/04/2008, 07h05
  2. Réponses: 3
    Dernier message: 08/10/2007, 16h05
  3. Affecter une valeur dans un champ
    Par cicubea dans le forum VBA Access
    Réponses: 2
    Dernier message: 02/08/2007, 22h28
  4. qu'est ce qu'une chaîne vide?
    Par ladygtk dans le forum C
    Réponses: 34
    Dernier message: 14/03/2007, 14h47
  5. Réponses: 4
    Dernier message: 08/11/2005, 17h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo