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

C# Discussion :

Requete SQL et Null


Sujet :

C#

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 81
    Points : 43
    Points
    43
    Par défaut Requete SQL et Null
    Bonjour,

    j'ai lu pas mal de chose sur ce site mais, je ne saisi toujours pas certaines choses.

    J'ai une appli dans laquelle je fait un SELECT qui me retourne une seule ROW et dans la foulée je fais une INSERT de cette même ligne avec juste un champ que j'incremente. J'utilise un datareader.

    Dans un premier temps j'ai ecrit mon INSERT avec des datareader.GetInt16 ou GetInt32 ou GetString en fonction du type du champs dans la base de données. Puis je suis tombé sur GetSqlValue, qui ne prend pas compte du type, donc très bien j'ai pu faire une boucle.

    Seulement, dans les éléments retournés par mon SELECT j'ai des champs Null. Alors j'ai d'abord essayé ceci (dr est mon DataReader):

    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
    strRequeteInsert = "INSERT INTO Samples (" + intAuditNumberNouveau;
     
                            for (int k = 1; k < dr.FieldCount; k++)
                            {
                                //MessageBox.Show(dr.GetSqlValue(k).ToString());
                                if (dr.GetSqlValue(k) == DBNull.Value)
                                {
                                    strRequeteInsert += ",Null";
                                }
                                else
                                {
                                    strRequeteInsert += ",'" + dr.GetSqlValue(k).ToString().Replace("'", "''") + "'";
                                }
                            }
     
                            strRequeteInsert += ")";
    Mais je n'entre jamais dans le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (dr.GetSqlValue(k) == DBNull.Value)
    Alors j'ai fait:
    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
    strRequeteInsert = "INSERT INTO Samples (" + intAuditNumberNouveau;
     
                            for (int k = 1; k < dr.FieldCount; k++)
                            {
                                //MessageBox.Show(dr.GetSqlValue(k).ToString());
                                if (dr.GetSqlValue(k).ToString() == "Null")
                                {
                                    strRequeteInsert += ",Null";
                                }
                                else
                                {
                                    strRequeteInsert += ",'" + dr.GetSqlValue(k).ToString().Replace("'", "''") + "'";
                                }
                            }
     
                            strRequeteInsert += ")";
    Déjà je ne suis pas satisfait par ce code, mais en plus ça ne peut fonctionner car je mets entre quote tous les champs hors quand un champs est de type Int on ne met pas de quote.

    Comment puis je faire?

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    1 377
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 377
    Points : 1 628
    Points
    1 628
    Par défaut
    Citation Envoyé par alexking2005 Voir le message
    Bonjour,

    j'ai lu pas mal de chose sur ce site mais, je ne saisi toujours pas certaines choses.

    J'ai une appli dans laquelle je fait un SELECT qui me retourne une seule ROW et dans la foulée je fais une INSERT de cette même ligne avec juste un champ que j'incremente. J'utilise un datareader.

    Dans un premier temps j'ai ecrit mon INSERT avec des datareader.GetInt16 ou GetInt32 ou GetString en fonction du type du champs dans la base de données. Puis je suis tombé sur GetSqlValue, qui ne prend pas compte du type, donc très bien j'ai pu faire une boucle.

    Seulement, dans les éléments retournés par mon SELECT j'ai des champs Null. Alors j'ai d'abord essayé ceci (dr est mon DataReader):

    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
    strRequeteInsert = "INSERT INTO Samples (" + intAuditNumberNouveau;
     
                            for (int k = 1; k < dr.FieldCount; k++)
                            {
                                //MessageBox.Show(dr.GetSqlValue(k).ToString());
                                if (dr.GetSqlValue(k) == DBNull.Value)
                                {
                                    strRequeteInsert += ",Null";
                                }
                                else
                                {
                                    strRequeteInsert += ",'" + dr.GetSqlValue(k).ToString().Replace("'", "''") + "'";
                                }
                            }
     
                            strRequeteInsert += ")";
    Mais je n'entre jamais dans le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (dr.GetSqlValue(k) == DBNull.Value)
    Alors j'ai fait:
    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
    strRequeteInsert = "INSERT INTO Samples (" + intAuditNumberNouveau;
     
                            for (int k = 1; k < dr.FieldCount; k++)
                            {
                                //MessageBox.Show(dr.GetSqlValue(k).ToString());
                                if (dr.GetSqlValue(k).ToString() == "Null")
                                {
                                    strRequeteInsert += ",Null";
                                }
                                else
                                {
                                    strRequeteInsert += ",'" + dr.GetSqlValue(k).ToString().Replace("'", "''") + "'";
                                }
                            }
     
                            strRequeteInsert += ")";
    Déjà je ne suis pas satisfait par ce code, mais en plus ça ne peut fonctionner car je mets entre quote tous les champs hors quand un champs est de type Int on ne met pas de quote.

    Comment puis je faire?
    Si j'ai bien compris tu veux vérifier si ton DBDataReader est null ? Utilise alors IsDBNull(int)

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Août 2005
    Messages
    1 240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 1 240
    Points : 1 646
    Points
    1 646
    Par défaut
    tu dois avoir la propriété IsNull qui te permet de savoir si ton champ est null.

    sinon dr.GetSqlValue(k) == "NULL" ca ne marche pas vu que null n'est pas une chaine en sql.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 81
    Points : 43
    Points
    43
    Par défaut
    Bonjour,

    effectivement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if (dr.IsDBNull(k))
                                {
                                    strRequeteInsert += ",Null";
                                }
                                else
                                {
                                    strRequeteInsert += ",'" + dr.GetSqlValue(k).ToString().Replace("'", "''") + "'";
                                }
    Fonctionne mais ma requete ne prend pas en compte le type des champs. Si mon champ est de type Int, je ne dois pas mettre sa valeur entre quote. (à moins que je ne me trompe).
    Comment reconstruire ma requete convenablement?

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 81
    Points : 43
    Points
    43
    Par défaut
    Non mais QUEL AMATEUR JE FAIS!!!

    La:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strRequeteInsert = "INSERT INTO Samples VALUES (" + intAuditNumberNouveau;
    C'est mieux!

    Désolé

  6. #6
    Membre éclairé
    Avatar de shwin
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    568
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2003
    Messages : 568
    Points : 777
    Points
    777
    Par défaut
    Tu ne semble pas connaitre les SQLParameters. Regarde de ce coté pour avoir du code qui n'est pas sensible a du SQLInjection.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Requete SQL avec gestion de NULL
    Par mail.spam dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 27/08/2012, 17h29
  2. [XL-2007] probleme requete sql renvoie null
    Par comme de bien entendu dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 08/11/2010, 10h49
  3. Requete sql is null
    Par Meloooo dans le forum C#
    Réponses: 4
    Dernier message: 03/06/2009, 10h20
  4. Probleme de requete SQL avec la valeur NULL
    Par samyghan dans le forum Installation
    Réponses: 8
    Dernier message: 12/03/2006, 17h24
  5. [JDBC] retour de requete sql avec valeur NULL
    Par maxxou dans le forum JDBC
    Réponses: 3
    Dernier message: 13/09/2004, 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