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

ADO.NET Discussion :

[VB.NET - DB2/400] IDBCommand et IDataParameter sur SELECT blabla WHERE blabla IN blabla


Sujet :

ADO.NET

  1. #1
    Membre averti
    Inscrit en
    Novembre 2008
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 43
    Par défaut [VB.NET - DB2/400] IDBCommand et IDataParameter sur SELECT blabla WHERE blabla IN blabla
    Bonjour à tous,

    J'ai un petit souci avec des requêtes paramétrées dans un programme lorsque j'utilise une clause WHERE IN dans la requête...

    Si j'écris ma requête avec paramètres, je ne récupère qu'un seul résultat au lieu des N résultats demandés :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM blabla WHERE Critere IN (@Valeurs)
    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
    17
    18
    19
     
    Try
        Dim ds As New DataSet("Pieces")
        ds.Tables.Add("ArticlesVendus")
     
        Dim strListeSaisie As String = "125, 127"
     
        ' Création du DataAdapter via une classe externe
        Dim db As IDbDataAdapter = DB2Tools.CreateAdapter(My.Resources.Articles.ParNumSaisieSAV)
        db.TableMappings.Add("Table", "ArticlesVendus")
     
        ' Ajout du paramètre à la commande via la classe utilitaire
        DB2Tools.AddParameter(db.SelectCommand, "Saisies", strListeSaisies)
     
        db.Fill(ds)
    Catch ex As Exception
        Throw New PiecesFactoryException(
            String.Format("Erreur du moteur de base de données ({0})", ex.Message), ex)
    End Try
    Et miracle, je ne récupère qu'une seule ligne de résultat au lieu des n que devrait me retourner la requête.

    Si j'utilise la requête avec String.Format, ça me renvoie le bon nombre de lignes....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM blabla WHERE Critere IN ({0})
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
        Dim ds As New DataSet("Pieces")
        ds.Tables.Add("ArticlesVendus")
     
        Dim strListeSaisie As String = "125, 127"
     
        ' Création du DataAdapter via une classe externe en formattant directement la requête
        Dim db As IDbDataAdapter = DB2Tools.CreateAdapter(
            String.Format(My.Resources.Articles.ParNumSaisieSAV, strListeSaisie))
        db.TableMappings.Add("Table", "ArticlesVendus")
    Et pour info, le code de la méthode AddParameter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Public Shared Sub AddParameter(ByRef cmd As IDbCommand, ByVal name As String, ByVal value As Object)
        Dim pa As IDataParameter = cmd.CreateParameter()
        pa.ParameterName = name
        pa.Value = value
     
        cmd.Parameters.Add(pa)
    End Sub
    Je sèche... Et comme les paramètres, c'est mieux, ben ça m'emmerde, et j'aimerais bien savoir comment qu'on fait pour utiliser les paramètres avec la clause IN...

    Merci d'avance pour vos réponses...

    PS. J'espère que c'est le bon forum (je ne sais pas d'où vient mon problème en fait... ADO.NET ou le provider .NET du SGDBR (IBM.Data.DB2.iSeries))

  2. #2
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    j'aimerais bien savoir comment qu'on fait pour utiliser les paramètres avec la clause IN...
    Cela me semble malheuresement impossible directement.

    Essayer ces 2 solutions qui évitent de créer une tables annexe:
    1. Dim strListeSaisie As String = """125"", ""127"""
    2. Mettre à jour la commande Select en remplaçant dynamiquement "@Valeurs" par "@Valeur1,"@Valeur2,..,@ValeurN," et en créant n paramètres contenant chacun une valeur.

  3. #3
    Membre averti
    Inscrit en
    Novembre 2008
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 43
    Par défaut
    Merci pour la réponse... j'espérais que ce soit possible, mais visiblement, ADO.NET a du progrès à faire

    Malheureusement pour la première solution, l'utilisation des " ou ' génère une erreur de type au niveau du provider DB2, car la colonne correspondante est du type entier.

    Pour la deuxième solution, je vais essayer de rajouter ça dans la classe utilitaire, mais ça me semble un peu lourd...

    Je crois que je vais rester sur la technique du String.Format pour le moment (les valeurs provenant d'une autre table, je peux *théoriquement* leur faire confiance... pour les saisies utilisateur, c'est une autre histoire )

  4. #4
    Membre Expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Par défaut
    Vous devez créer autant de paramètres que d'élément dans le IN...

    Et générer votre CommandString comme cela:
    IN(@1,@2,@3,@4...).


    Personnellement je passerais par les TVP si DB2 le permet (SQL SERVER 2008 le permet c'est beaucoup plus propre).

  5. #5
    Membre Expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Par défaut
    Après recherche je craint que non...


    Au passage l'utilisation du SELECT * est à proscrire dans vos requêtes!(sauf utilisation dans une sous requête comme EXISTS...)

  6. #6
    Membre averti
    Inscrit en
    Novembre 2008
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 43
    Par défaut
    Merci également pour votre réponse et les TVP, je ne connaissais pas, mais ça peut toujours être utile le jour où je ne serais plus sur DB2...

    En effet, je me suis résigné à dynamiquement générer les paramètres de la requête, faute de mieux.

    Sinon, pour le SELECT *, encore heureux que je n'écris pas mes requêtes comme ça, vu la taille des tables attaquées

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

Discussions similaires

  1. Import sur DB2/400 iserie navigator
    Par suziwan dans le forum DB2
    Réponses: 1
    Dernier message: 16/10/2007, 12h48
  2. Augmenter STMTHEAP sur DB2/400
    Par hatoug dans le forum DB2
    Réponses: 7
    Dernier message: 29/08/2007, 16h16
  3. Question sur index DB2 400
    Par Jibon dans le forum DB2
    Réponses: 4
    Dernier message: 19/08/2007, 16h58
  4. [C#] [VS.NET] Peut on faire un accesseur sur objets?
    Par Designotik dans le forum Windows Forms
    Réponses: 3
    Dernier message: 06/01/2005, 21h56
  5. [VB.NET] [PPC] Comment faire un formulaire sur pls pages?
    Par papy27 dans le forum Windows Mobile
    Réponses: 10
    Dernier message: 03/06/2004, 17h23

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