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

VB.NET Discussion :

Utiliser plusieurs fois un paramètre ODBC


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 793
    Par défaut Utiliser plusieurs fois un paramètre ODBC
    Bonjour,

    j'ai essayé de trouver des réponses à ma question sur les forums C# et VB mais rien trouvé.

    Voici ma question, plutôt simple :

    J'utilise ODBC, j'ai une requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from matable where mois = ? and annee = ? and mois2 = ?
    Je déclare donc actuellement 3 paramètres ODBC que j'ajoute à ma commande, @mois, @annee, @mois2.

    ça fonctionne très bien, mais je dois déclarer le même paramètre plusieurs fois, si je peux éviter je trouverais ça plus clair et plus propre

    Y a-t-il une syntaxe qui me permet d'utiliser le même paramètre pour mois et mois2 ?

    Merci

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 197
    Par défaut
    "where mois = mois2 and mois = ? and annee = ?" ?
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    "where mois = mois2 and mois = ? and annee = ?" ?
    Pour ce cas particulier ça me semble effectivement une bonne solution

    Sinon, dans le cas général, si la seul façon d'indiquer un paramètre dans la requête est "?", tu es un peu coincé : le binding des paramètres se fera uniquement par position puisque tu ne peux pas préciser le nom.

    Est-ce que tu es obligé d'utiliser ODBC ? La plupart des SGBD fournissent aussi un connecteur ADO.NET natif, qui offre généralement de meilleures performances et plus de fonctionnalités (par exemple le binding par nom). Quel est le SGBD utilisé ?

  4. #4
    Membre Expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 793
    Par défaut
    Merci pour vos 2 réponses.

    Pol63 j'ai déjà essayé ça et je me suis rendu compte qu'au niveau efficacité c'est attroce, je faisais toutes mes jointures comme ça puisque ça me paraissait logique, mais en précisant directement la valeur du champs plutôt qu'en le rattachant à un autre la requête s'effectue beaucoup plus vite.

    C'est un projet que j'ai repris je suis donc resté comme ça pour le moment, mais je suis en DB2 sur un AS400, il y a une DLL ibm IBM.DATA.DB2, je vais me pencher là-dessus voir si avec ce connecteur ça serait mieux, au niveau efficacité et au niveau de pouvoir préciser ou nom quel paramètre on veut utiliser à tel endroit.

  5. #5
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 197
    Par défaut
    Citation Envoyé par asmduty Voir le message
    Pol63 j'ai déjà essayé ça et je me suis rendu compte qu'au niveau efficacité c'est attroce, je faisais toutes mes jointures comme ça puisque ça me paraissait logique, mais en précisant directement la valeur du champs plutôt qu'en le rattachant à un autre la requête s'effectue beaucoup plus vite.
    !?
    qu'une sous requete se base sur une valeur de la requete de base je veux bien croire que c'est à éviter mais ce n'est pas ton cas
    si tu arrives à constater une différence de performances entre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from table where a = ? and b = ?
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from table where a = b and b = ?
    change de sgbdr tout de suite !
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    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
    Tu devrais pouvoir te connecter à DB2 ebn utilisant OleDb
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    using System;
    using System.Data;
    using System.Data.OleDb;
     
    class Db2Connect{
    static void Main() {
    string connString = @"provider = IBMDADB2.1;persist security info = false;data source = sample;";
     
    OleDbConnection conn = new OleDbConnection(connString);
     
    try
    {
    conn.Open();
    Console.WriteLine("Connection opened.");
     
    Console.WriteLine("Connection Properties:"); 
    Console.WriteLine("\tConnection String: {0}", conn.ConnectionString); 
    Console.WriteLine("\tDatabase: {0}",conn.Database); 
    Console.WriteLine("\tDataSource: {0}",conn.DataSource);
    Console.WriteLine("\tServerVersion: {0}",conn.ServerVersion);
    Console.WriteLine("\tState: {0}",conn.State);
    } catch (OleDbException e) {
    Console.WriteLine("Error: " + e); 
    } finally {
    conn.Close();
    Console.WriteLine("Connection closed.");
    }
    }
    }
    Variantes pour la connection string :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    "Provider=DB2OLEDB;Network Transport Library=TCPIP;Network Address=XXX.XXX.XXX.XXX;Initial Catalog=MyCtlg;
    Package Collection=MyPkgCol;Default Schema=Schema;User ID=MyUser;Password=MyPW
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    "Provider=IBMDADB2;Database=sample;HOSTNAME=db2host;PROTOCOL=TCPIP;PORT=50000;
    uid=myUserName;pwd=myPwd;

  7. #7
    Membre Expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 793
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    !?
    qu'une sous requete se base sur une valeur de la requete de base je veux bien croire que c'est à éviter mais ce n'est pas ton cas
    si tu arrives à constater une différence de performances entre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from table where a = ? and b = ?
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from table where a = b and b = ?
    change de sgbdr tout de suite !
    Ecoutes moi je suis pas super heureux de la base DB2 semi-relationnelle de l'AS400 mais je ne peux rien y faire.
    Je referai un exemple pour poster les différences de rapidité.

    Mercid e ta réponse Graffito, je vais voir avec le provider IBM qui est censé être le mieux, et si c'est pas super je testerai OLEDB

  8. #8
    Membre Expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 793
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    !?
    qu'une sous requete se base sur une valeur de la requete de base je veux bien croire que c'est à éviter mais ce n'est pas ton cas
    si tu arrives à constater une différence de performances entre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from table where a = ? and b = ?
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from table where a = b and b = ?
    change de sgbdr tout de suite !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select FACT.ACTACT, bchld,IIM2.iityp type_enfant, IIM2.iclas classe_enfant, FACT2.ACTACT activite_enfant, sum(tqty) quantite, sum(tqty*(cftlvl+cfplvl)*bqreq) valeur   from bpcs61usrf.mbmhst  inner join bpcs61usrf.iimhst IIM on (IIM.iprod = bprod and IIM.imois = mmois and IIM.iannee = mannee and IIM.iid = 'IM')  inner join bpcs61usrf.iimhst IIM2 on (IIM2.iprod = bchld and IIM2.imois = mmois and IIM2.iannee = mannee and IIM2.iid = 'IM')  inner join bpcs61usrf.ftyp FTYP on IIM.iityp = FTYP.typtyp   inner join bpcs61usrf.ftyp FTYP2 on IIM2.iityp = FTYP2.typtyp   inner join bpcs61usrf.fact FACT on SUBSTR(FACT.actcen, 1, 1) = case when FTYP.typact = 0 then SUBSTR(IIM.iclas, 1, 1) else CHAR(FTYP.typact) end   inner join bpcs61usrf.fact FACT2 on SUBSTR(FACT2.actcen, 1, 1) = case when FTYP2.typact = 0 then SUBSTR(IIM2.iclas, 1, 1) else CHAR(FTYP2.typact) end   inner join bpcs61f.ithl01 on (bprod = tprod and thcntr = '201110' and ttype = 'PR')   LEFT JOIN bpcs61usrf.cmfhst on (cfprod = bchld and cffac = 'F1' and cfcset = 2 and cfcbkt = 0 and cfmnth = mmois and cfyear = mannee and cfid = 'CF')   where bid = 'BM' and mmois = 10 and mannee = 2011  group by FACT.ACTACT, bchld,IIM2.iityp,  IIM2.iclas, FACT2.ACTACT     having bchld in  (   select bchld    from bpcs61usrf.mbmhst   inner join bpcs61usrf.iimhst on (iprod = bprod and iid = 'IM' and imois = mmois and iannee = mannee)   inner join bpcs61usrf.ftyp on iityp = typtyp   inner join bpcs61usrf.fact on SUBSTR(actcen, 1, 1) = case when typact = 0 then SUBSTR(iclas, 1, 1) else CHAR(typact) end    where bid = 'BM' and mmois = 10 and mannee = 2011   group by bchld    having count (distinct actact) >1  )  and FACT.actact <> FACT2.actact  order by bchld, fact.actact
    Statement ran successfully (123154 ms)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    > select FACT.ACTACT, bchld,IIM2.iityp type_enfant, IIM2.iclas classe_enfant, FACT2.ACTACT activite_enfant, sum(tqty) quantite, sum(tqty*(cftlvl+cfplvl)*bqreq) valeur   from bpcs61usrf.mbmhst  inner join bpcs61usrf.iimhst IIM on (IIM.iprod = bprod and IIM.imois = 10 and IIM.iannee = 2011 and IIM.iid = 'IM')  inner join bpcs61usrf.iimhst IIM2 on (IIM2.iprod = bchld and IIM2.imois = 10 and IIM2.iannee = 2011 and IIM2.iid = 'IM')  inner join bpcs61usrf.ftyp FTYP on IIM.iityp = FTYP.typtyp   inner join bpcs61usrf.ftyp FTYP2 on IIM2.iityp = FTYP2.typtyp   inner join bpcs61usrf.fact FACT on SUBSTR(FACT.actcen, 1, 1) = case when FTYP.typact = 0 then SUBSTR(IIM.iclas, 1, 1) else CHAR(FTYP.typact) end   inner join bpcs61usrf.fact FACT2 on SUBSTR(FACT2.actcen, 1, 1) = case when FTYP2.typact = 0 then SUBSTR(IIM2.iclas, 1, 1) else CHAR(FTYP2.typact) end   inner join bpcs61f.ithl01 on (bprod = tprod and thcntr = '201110' and ttype = 'PR')   LEFT JOIN bpcs61usrf.cmfhst on (cfprod = bchld and cffac = 'F1' and cfcset = 2 and cfcbkt = 0 and cfmnth = 10 and cfyear = 2011 and cfid = 'CF')   where bid = 'BM' and mmois = 10 and mannee = 2011  group by FACT.ACTACT, bchld,IIM2.iityp,  IIM2.iclas, FACT2.ACTACT     having bchld in  (   select bchld    from bpcs61usrf.mbmhst   inner join bpcs61usrf.iimhst on (iprod = bprod and iid = 'IM' and imois = 10 and iannee = 2011)   inner join bpcs61usrf.ftyp on iityp = typtyp   inner join bpcs61usrf.fact on SUBSTR(actcen, 1, 1) = case when typact = 0 then SUBSTR(iclas, 1, 1) else CHAR(typact) end    where bid = 'BM' and mmois = 10 and mannee = 2011   group by bchld    having count (distinct actact) >1  )  and FACT.actact <> FACT2.actact  order by bchld, fact.actact
    Statement ran successfully (8344 ms)

    N'ayant trouvé aucune solution à mon problème de base, tampis je passerai autant de fois que demandé le paramètre mois, et le paramètre année.

    Merci pour toutes vos propositions et votre aide

Discussions similaires

  1. Réponses: 5
    Dernier message: 07/04/2008, 17h40
  2. Utiliser plusieurs fois le même composant
    Par Ren97 dans le forum Composants VCL
    Réponses: 6
    Dernier message: 01/03/2008, 01h49
  3. Utiliser plusieurs fois ma classe en même temps
    Par Princeless74 dans le forum C++
    Réponses: 6
    Dernier message: 05/01/2008, 21h54
  4. Réponses: 5
    Dernier message: 24/08/2006, 15h00
  5. Réponses: 2
    Dernier message: 22/05/2006, 14h08

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