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 :

Affecter une valeur NULL à un paramètre d'un Query ?


Sujet :

Delphi

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 165
    Points : 116
    Points
    116
    Par défaut Affecter une valeur NULL à un paramètre d'un Query ?
    Bonsoir,

    je fais une requete par Query et je voudrais passer mes valeurs par Parametre.

    Or je voudrais affecter NULL a certaines valeurs de la base qui sont de type varchar, bigint, datetime etc mais pas moyen de pouvoir y arriver sous delphi.

    J'ai essaye un truc de ce style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
            SQLQuery.ParamByName('LOGIN').Value := NULL;
    mais au mieux je me retrouve avec un element "vide" ( => '') dans ma base, au lieu d avoir un blocage a la mise a jour (not null)


    Une idee ?

    Merci.

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Août 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 165
    Points : 116
    Points
    116
    Par défaut
    j ai essaye ca aussi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            SQLQuery.ParamByName('LOGIN').Value := NULL;
            SQLQuery.ParamByName('LOGIN').Bound := True;
    sans resultat non plus, tjs insertion chaine vide

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 16
    Points : 20
    Points
    20
    Par défaut
    Salut,

    il y a une ou deux choses qui ne sont pas très claires pour moi :
    tu affectes null à ton parambyname... donc à un paramètre de ta requête j'imagine... ce qui sous entend que ta requête est une requête d'insertion ?

    - si oui, je pense que 1) tu ne fais pas la meilleure utilisation possible des Query, et 2) la vérification du null doit se faire au niveau de la base de données.

    - si non, je crains de ne pas bien avoir compris ta question...

    Dans les deux cas, un peu plus d'infos sur le contexte seraient les bienvenues...

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Août 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 165
    Points : 116
    Points
    116
    Par défaut
    Bonjour,

    j'ai une fonction generique d'insertion d'un tuple dans ma table.

    Un truc du style :

    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
    16
     
    SQLDataBase.StartTransaction;
    try
        SQLQuery.SQL.Text := 'INSERT INTO `Users`('+
                                        ' `dbLOGIN`,'+
                                        ' `dbNAME`,'+
                                        ' `dbRIGHTS`,'+
                                        ' `dbACTIVATED`'+
                                        ' ) '+
                                        'VALUES(:LOGIN, :NAME, :RIGHTS, :ACTIVATED)';
        SetParams( aUser);
        SQLQuery.ExecSQL;
        SQLDataBase.Commit;
    except
        SQLDataBase.Rollback;
    end;
    Et donc je voudrais affecter mes parametres avec leurs valeurs.
    Or j'ai mis dans la db (mysql) que dbLogin etait NOT NULL, justement pour que la requete d insertion "plante" si ce n etait pas le cas.

    Il n'est pas possible d initialiser un string a NULL, donc j aurais aimé passer NULL a mon parametre si le login nest pas renseigné (si je mets login := '' je vais me retrouver avec un user sans login, ce n est pas mon souhait).

    Bien entendu, je pourrais faire des tests dans l appli pour verifier le renseignement de login ou non, mais je pensais qu'une contrainte d'integrite servait aussi à cela.


    Merci

    nb: que cela soit d insertion, ou d update peu importe cela ne change rien.... il doit bien etre possible de passer NULL à la requete pour certaines valeurs ?

    Autre exemple plus simple :

    j ai une autre table avec une cle etrangere sur la table des users, or je ne veux pas forcement renseigne cette valeur (donc null par defaut, la db ne verifie pas la contrainte d integrite de la cle etrangere si la valeur est null).
    Mais dans mon appli, pas moyen de savoir si ce user va etre renseigne ou non, donc au depart j ai une initialisation à -1 de l index, or je ne peux pas inserer -1, mais par contre la ca serait super utile d affecter NULL au parametre.


    Une idée ?

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Février 2005
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 60
    Points : 75
    Points
    75
    Par défaut
    Que ce passe t il si tu ne renseigne pas le parametre ?
    Du genre :

    If valeur <> nil then query.parambyname(xxxx).value := valeur

  6. #6
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 435
    Points : 5 848
    Points
    5 848
    Par défaut
    salut,

    il ne faut pas indiquer de valeur mais à l'inverse il faut "nettoyer" le champs


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       SQLQuery.ParamByName('LOGIN').Clear;
       SQLQuery.ParamByName('LOGIN').Bound := True;

    @+ Phil

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Août 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 165
    Points : 116
    Points
    116
    Par défaut
    a titre d infos, j ai mis exactement le meme code avant que tu ne postes, et cela ne fonctionne pas (en tout cas pas avec le compo query que j'utilise, peut est ce que cela vient de la :s)

    J'ai abandonné cette solution... mais je pense que ta reponse est valable pour d autres query et sera utile a d autres personnes.

    Merci phil

  8. #8
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 673
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 673
    Points : 7 054
    Points
    7 054
    Par défaut
    Citation Envoyé par anapurna Voir le message
    il ne faut pas indiquer de valeur mais à l'inverse il faut "nettoyer" le champs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       SQLQuery.ParamByName('LOGIN').Clear;
       SQLQuery.ParamByName('LOGIN').Bound := True;
    J'ai le même problème.
    J'ai un insert dans lequel un champ doit recevoir la valeur NULL. J'ai testé ta solution, mais j'obtiens une erreur à l'exécution de la requête :
    le champ est d'un type inconnu
    Pourtant l'aide semble dire comme toi :
    Citation Envoyé par Aide Delphi
    La méthode Clear remplace la valeur du paramètre par NULL, mais n'affecte pas la valeur False à Bound. Toutefois, si la méthode Clear est utilisée pour lier le paramètre à une valeur NULL, affectez explicitement la valeur True.
    Il y a quelque chose d'autre à faire ?

  9. #9
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut

    As-tu essayé simplement avec ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SQLQuery.ParamByName('MY_PARAM').IsNull := True;
    @+

  10. #10
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 673
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 673
    Points : 7 054
    Points
    7 054
    Par défaut
    Citation Envoyé par Cl@udius Voir le message
    As-tu essayé simplement avec ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SQLQuery.ParamByName('MY_PARAM').IsNull := True;
    Impossible. IsNull est une propriété en lecture seule.


  11. #11
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 673
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 673
    Points : 7 054
    Points
    7 054
    Par défaut
    J'ai trouvé !!
    (ici https://forums.codegear.com/thread.jspa?threadID=16391 )

    Il faut indiquer le type du paramètre (d'où mon message d'erreur) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Query.ParamByName('poiop').Clear;      // Pour effacer le contenu du paramètre.
    Query.ParamByName('poiop').Bound := True;      // Pour indiquer à l'objet de ne pas chercher de valeur.
    Query.ParamByName('poiop').DataType := ftFloat;      // Type du paramètre (float dans l'exemple).
    Si ça n'y est pas déjà, ça mériterait d'être dans la FAQ. Apparemment, sur le net, je ne suis pas le seul à chercher la solution.

Discussions similaires

  1. [AC-2000] Affecter une valeur nulle à un champs
    Par forges dans le forum VBA Access
    Réponses: 2
    Dernier message: 11/04/2012, 07h57
  2. [AC-2003] Affecter une valeur nulle à un entier avant l'exécution de la requête
    Par flet le kid dans le forum VBA Access
    Réponses: 4
    Dernier message: 23/06/2009, 18h17
  3. Réponses: 3
    Dernier message: 10/06/2009, 22h03
  4. Réponses: 1
    Dernier message: 30/01/2008, 19h41
  5. CR XI : Traduire une valeur nulle et paramètre date
    Par dalhia101 dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 11/12/2007, 11h45

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