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

Delphi Discussion :

sql mettre un champ à NULL


Sujet :

Delphi

  1. #1
    Membre habitué
    Homme Profil pro
    Owner
    Inscrit en
    Décembre 2004
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Owner
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2004
    Messages : 466
    Points : 137
    Points
    137
    Par défaut sql mettre un champ à NULL
    Bonjour,
    Je souhaite mettre un champ à NULL
    Mes tentatives sont infructueuses
    soit le champ est vide (donc pas NULL)
    soit le string 'NULL' est affiché (ce qui n'est pas NULL comme attendu

    Voici mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Query.Active:=False;
    Query.SQL.Clear;
    Query.SQL.add('UPDATE Resultats set ');   
    Query.SQL.add('R_Image = ');  
    Query.SQL.add(quotedStr(''));
    Query.SQL.add(',R_DateTime = ');
    Query.SQL.add(quotedStr(''));
    Query.SQL.add(',CRC_Image=(''));            //ici mettre à NULL
    Query.SQL.add('WHERE  R_Image = '+quotedStr(DBADVGrid_Resultats.Cells[Acol,Arow]));
    Query.SQL.add(';');
    Query.ExecSQL(true) ;
    Le reste fonctionne parfaitement
    Merci pour votre aide
    PhilLu

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    707
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 707
    Points : 777
    Points
    777
    Par défaut
    Je ferais quelque chose comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    with Query do begin
      Active := FALSE;
      SQL.Clear;
      SQL.Add('UPDATE Resultats');
      SQL.Add('SET R_Image = :p0, R_DateTime = :p1, CRC_Image = :p2');
      SQL.Add('WHERE  R_Image = :p3;');
      Params[0].Clear;
      Params[0].Bound := TRUE;
      Params[1].Clear;
      Params[1].Bound := TRUE;
      Params[2].Clear;
      Params[2].Bound := TRUE;
      Params[3].AsString := DBADVGrid_Resultats.Cells[Acol,Arow];
      ExecSQL;
    end;

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    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 042
    Points : 40 955
    Points
    40 955
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    comme il s'agit d'une query , le plus simple est bien de mettre NULL

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    // version composants BDE 
    with Query do
     begin 
      SQL.Text:='UDPATE RESULTATS SET R_IMAGE=NULL, R_DATETIME=NULL, CRC_IMAGE=NULL WHERE R_IMAGE=:V';
      paramByName('V').asString:=DBADVGrid_Resultats.Cells[Acol,Arow];
      ExecSQL;
     end;
    soit le string 'NULL' est affiché
    affiché où ? dans la grille ? j'ai l'impression que R_IMAGE est un blob me trompe-je ?
    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

  4. #4
    Membre habitué
    Homme Profil pro
    Owner
    Inscrit en
    Décembre 2004
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Owner
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2004
    Messages : 466
    Points : 137
    Points
    137
    Par défaut
    Citation Envoyé par GoustiFruit Voir le message
    Je ferais quelque chose comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    with Query do begin
      Active := FALSE;
      SQL.Clear;
      SQL.Add('UPDATE Resultats');
      SQL.Add('SET R_Image = :p0, R_DateTime = :p1, CRC_Image = :p2');
      SQL.Add('WHERE  R_Image = :p3;');
      Params[0].Clear;
      Params[0].Bound := TRUE;
      Params[1].Clear;
      Params[1].Bound := TRUE;
      Params[2].Clear;
      Params[2].Bound := TRUE;
      Params[3].AsString := DBADVGrid_Resultats.Cells[Acol,Arow];
      ExecSQL;
    end;
    Merci pour ta réponse
    Je reçois malheureusement un message:
    "Le pilote dbExpress ne supporte pas le type de données TDBXTypes.UNKWOWN. Message d'erreur du fournisseur: ."

  5. #5
    Membre habitué
    Homme Profil pro
    Owner
    Inscrit en
    Décembre 2004
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Owner
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2004
    Messages : 466
    Points : 137
    Points
    137
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Bonjour,

    comme il s'agit d'une query , le plus simple est bien de mettre NULL

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    // version composants BDE 
    with Query do
     begin 
      SQL.Text:='UDPATE RESULTATS SET R_IMAGE=NULL, R_DATETIME=NULL, CRC_IMAGE=NULL WHERE R_IMAGE=:V';
      paramByName('V').asString:=DBADVGrid_Resultats.Cells[Acol,Arow];
      ExecSQL;
     end;

    affiché où ? dans la grille ? j'ai l'impression que R_IMAGE est un blob me trompe-je ?
    Salut et merci pour ta réponse
    Malheureusement, j'utilise SQLExpress et Datasnap

    R_Image est le nom de la photo, pas un blob.
    Dans la grille, le CRC contient si l'image est attribuée à cet enregistrement, le CRC de l'image.
    Ce champ fait partie de la clé composée du nom de l'image et du CRC.
    ce CRC doit être unique ou NULL (donc pas vide ou 'NULL' (string))
    Merci pour tes idées
    Bon dimanche

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    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 042
    Points : 40 955
    Points
    40 955
    Billets dans le blog
    62
    Par défaut
    Malheureusement, j'utilise SQLExpress et Datasnap
    d'où la bonne idée d'indiquer dés le début quels composants sont utilisés
    mais en fait cela ne change rien à la syntaxe du SQL , juste à l'utilisation des paramètres.

    Quant à :
    donc pas vide ou 'NULL' (string)
    NULL et vide (notes bien pas de quote) c'est la même chose dans la plupart des BDD (non renseignée non plus )
    donc quant tu dit
    ce CRC doit être unique ou NULL
    et selon ta demande , mon SQL est correct et devrait faire ce que tu demandes c.a.d. mettre à NULL les 3 champs selon une valeur de la colonne R_IMAGE passée par paramètre.

    Maintenant, avec dbExpress, il y a des subtilités de déclaration de paramètres et de champs
    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

  7. #7
    Membre habitué
    Homme Profil pro
    Owner
    Inscrit en
    Décembre 2004
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Owner
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2004
    Messages : 466
    Points : 137
    Points
    137
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    d'où la bonne idée d'indiquer dés le début quels composants sont utilisés
    mais en fait cela ne change rien à la syntaxe du SQL , juste à l'utilisation des paramètres.

    Quant à :

    NULL et vide (notes bien pas de quote) c'est la même chose dans la plupart des BDD (non renseignée non plus )
    donc quant tu dit
    et selon ta demande , mon SQL est correct et devrait faire ce que tu demandes c.a.d. mettre à NULL les 3 champs selon une valeur de la colonne R_IMAGE passée par paramètre.

    Maintenant, avec dbExpress, il y a des subtilités de déclaration de paramètres et de champs
    En utilisant ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Query.Active:=False;
    Query.SQL.Clear;
                    with Query do
     begin
      SQL.Text:='UDPATE RESULTATS SET R_IMAGE=NULL, R_DATETIME=NULL, CRC_IMAGE=NULL WHERE R_IMAGE=:V';
      paramByName('V').asString:=DBADVGrid_Resultats.Cells[Acol,Arow];
      ExecSQL;
     end;
    Delphi me retourne une erreur de syntaxe


  8. #8
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    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 042
    Points : 40 955
    Points
    40 955
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par PhilLU Voir le message
    Delphi me retourne une erreur de syntaxe
    Oui parce que avec DBExpress il me semble que la syntaxe de déclaration des paramètres n'est pas la même qu'avec mon code rapide (BDE ou ZEOSDBO).
    je n'ai pas le courage d'investiguer plus avant (trop bon repas modérément arrosé mais long ), juste dire que le Query.SQL.Clear n'est pas nécessaire , que par contre un Prepare après le SQL.Text:= pourrait améliorer la chose et qu'il faut vérifier comment on déclare les paramètres avec DBExpress
    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

Discussions similaires

  1. MySQL mettre un champ à NULL sous Delphi
    Par PhilLU dans le forum Delphi
    Réponses: 0
    Dernier message: 30/05/2015, 18h37
  2. mettre un champ à Null
    Par looping dans le forum Bases de données
    Réponses: 4
    Dernier message: 04/07/2013, 15h17
  3. [VB2008E] Comment mettre un champs à NULL ?
    Par dsolheid dans le forum Windows Forms
    Réponses: 3
    Dernier message: 09/02/2008, 23h24
  4. un if en sql (Test sur champ NULL)
    Par vince_grenoblois dans le forum Langage SQL
    Réponses: 6
    Dernier message: 24/07/2006, 13h53
  5. Réponses: 6
    Dernier message: 17/06/2005, 14h40

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