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

Windows Mobile .NET Discussion :

[CF][C#] Comment optimiser mes requêtes avec SqlCE ?


Sujet :

Windows Mobile .NET

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 560
    Points : 148
    Points
    148
    Par défaut [CF][C#] Comment optimiser mes requêtes avec SqlCE ?
    Salut,

    Je voudrais votre avis sur le process suivant qui me paraît lent et qui au bout d'un nombre de code lus important commence à se faire ressentir.

    1. Lecture de code barre avec un lecteur
    2. Avant intégration dans la table, vérifier si le code n'existe pas déjà
    3. S'il n'existe pas, on l'intègre

    Voilà le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    request = "SELECT CAB_COLIS FROM COLIS WHERE CAB_COLIS='"
                   + code + "'";
    if(clsD.searchData(request) == false)
    {
      // Display the code in a textbox
      // and add the barcode in the table
    }
    else
    { // Display an error message}
    La fonction appelée étant la suivante :
    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
     
    public bool searchData(string req)
    {
       bool status = false;
       SqlCeConnection connDB = new SqlCeConnection(strConn);
       SqlCeCommand cmndDB = new SqlCeCommand(req, connDB);
       SqlCeDataReader drdrDB;				
       try
       {
         connDB.Open();
         drdrDB = cmndDB.ExecuteReader();			
         while ( drdrDB.Read() )
         { status = true;}
         drdrDB.Close();
         connDB.Close();
       }
       catch(Exception ex)
       {
          MessageBox.Show(ex.ToString(), "Erreur", 
          System.Windows.Forms.MessageBoxButtons.OK,
          System.Windows.Forms.MessageBoxIcon.Hand,
          System.Windows.Forms.MessageBoxDefaultButton.Button2);
       }
       return status;
    }
    Voilà merci pour toute suggestion pour ce sujet.

  2. #2
    Membre expérimenté
    Avatar de freddyboy
    Homme Profil pro
    Architecte technique
    Inscrit en
    Novembre 2003
    Messages
    810
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Novembre 2003
    Messages : 810
    Points : 1 696
    Points
    1 696
    Par défaut
    vu que tu cherche juste une info dans la base tu peux essayer un ExecuteScalar au lieu de l'ExecuteReader. Cela va t'viter le while apres je pense, c'est peut etre deja une economie de temps. Ensuite si tu shoot des code barre souvent et donc que tu fais autant de recherche dans la base c'est peut etre interessant d'ouvrir la connexion une seule fois et de la fermer à la sortie de l'appli ou une fois que tu n'en as plus besoin.

    Enfin se sont juste des pistes a toi de voir apres.

    @+
    Someday I will be the most powerful Jedi !

    Freddyboy - Blog

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 560
    Points : 148
    Points
    148
    Par défaut
    Merci pour ces infos.

    Concernant la commande "ExecuteScalar", je ne sais pas trop comment récupérer la valeur de retour.

    Si il n'y a aucun code dans la table, je suis bloqué car j'obtiens un "NullReferenceException".

    Merci pour toute info complémentaire.

  4. #4
    Membre expérimenté
    Avatar de freddyboy
    Homme Profil pro
    Architecte technique
    Inscrit en
    Novembre 2003
    Messages
    810
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Novembre 2003
    Messages : 810
    Points : 1 696
    Points
    1 696
    Par défaut
    Citation Envoyé par david71
    Concernant la commande "ExecuteScalar", je ne sais pas trop comment récupérer la valeur de retour.

    Si il n'y a aucun code dans la table, je suis bloqué car j'obtiens un "NullReferenceException".
    pour utiliser ExecuteScalar il y a de la doc sur msdn pour cela.

    @+
    Someday I will be the most powerful Jedi !

    Freddyboy - Blog

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 560
    Points : 148
    Points
    148
    Par défaut
    Bon je ne comprends pas, en principe lorsque je fais la requête suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT CAB_COLIS FROM COLIS WHERE CAB_COLIS='021100381533'
    Je dois avoir une chaîne retournée et je n'obtiens rien avec le code suivant :

    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
     
    ...
    bool status = false;			
    SqlCeConnection connDB = new SqlCeConnection(strConn);
    SqlCeCommand cmndDB = new SqlCeCommand(req, connDB);
    try
    {
      //  Ouverture de la connexion
      connDB.Open();
      //  Exécution de la requête				
      System.String tmp = (System.String)cmndDB.ExecuteScalar();
      status = true;
      //drdrDB.Close();
      //  Fermeture de la connexion
      connDB.Close();
    }
    catch(Exception ex)
    {
       MessageBox.Show(ex.ToString(), "Erreur",
       System.Windows.Forms.MessageBoxButtons.OK,
       System.Windows.Forms.MessageBoxIcon.Hand,
       System.Windows.Forms.MessageBoxDefaultButton.Button2);
    }
    return status;
    ...
    Merci d'avance pour toute réponse.

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 560
    Points : 148
    Points
    148
    Par défaut
    OK, autre question, dans le cas où je dois créer des indexs, comment puis-je faire cette action ?

    C'est dans la définition des tables ?

    A+

  7. #7
    Membre expérimenté
    Avatar de freddyboy
    Homme Profil pro
    Architecte technique
    Inscrit en
    Novembre 2003
    Messages
    810
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Novembre 2003
    Messages : 810
    Points : 1 696
    Points
    1 696
    Par défaut
    Citation Envoyé par david71
    OK, autre question, dans le cas où je dois créer des indexs, comment puis-je faire cette action ?

    C'est dans la définition des tables ?

    A+
    tu as un exemple ici : http://www.windowsitlibrary.com/Content/1016/05/1.html

    Par contre je ne sais pas quelle version tu utilise. Les index sont dispo sur la version 2.0 mais je ne sais pas pour la version 1.0

    @+
    Someday I will be the most powerful Jedi !

    Freddyboy - Blog

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 560
    Points : 148
    Points
    148
    Par défaut
    Bon j'ai essayé de créer un index dans la base, ça a marché, mais dans le QueryAnalyser, j'ai remarqué que j'avais déjà un index !

    En effet, je prends l'exemple d'une table TABLE1 que j'avais créé de cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    cmndDB.CommandText =
    " CREATE TABLE TABLE1 " +
    "  ( CAB_COLIS nchar(20) not null " +
    "         CONSTRAINT PKCOLIS PRIMARY KEY " +
    "  , CAB_DISTRIB nchar(20) not null " +
    "  , CAB_REPRISE nchar(20) not null " +
    "  , CODE_COLIS nchar(4) not null " +
    "  , ACC_COLIS nchar(2) not null " +
    "  ) ";	
    ...
    En fait, visiblement, cette instruction "CONSTRAINT PKCOLIS PRIMARY KEY" est un index, car dans le Query Analyser, en déployant la table "TABLE1", j'ai dans "indexes" PKCOLIS.

    Donc clé primaire équivaut à index ?

  9. #9
    Membre expérimenté
    Avatar de freddyboy
    Homme Profil pro
    Architecte technique
    Inscrit en
    Novembre 2003
    Messages
    810
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Novembre 2003
    Messages : 810
    Points : 1 696
    Points
    1 696
    Par défaut
    c'est possible mais je ne suis pas sur. Il faudrait verifier. Peut etre des infos ici : http://msdn.microsoft.com/library/de...rver2000CE.asp

    @+
    Someday I will be the most powerful Jedi !

    Freddyboy - Blog

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 560
    Points : 148
    Points
    148
    Par défaut
    Bon, merci pour ces infos, mais visiblement en ouvrant et en fermant des connexions à une base c'est cela qui prenait du temps.
    A chaque insertion dans la base et à chaque recherche, j'ouvrais et je fermais une connexion.

    En ouvrant la connexion à la base une fois pour toute pendant le process d'insertion, les performances sont meilleures...

  11. #11
    Membre expérimenté
    Avatar de freddyboy
    Homme Profil pro
    Architecte technique
    Inscrit en
    Novembre 2003
    Messages
    810
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Novembre 2003
    Messages : 810
    Points : 1 696
    Points
    1 696
    Par défaut
    Citation Envoyé par freddyboy
    Ensuite si tu shoot des code barre souvent et donc que tu fais autant de recherche dans la base c'est peut etre interessant d'ouvrir la connexion une seule fois et de la fermer à la sortie de l'appli ou une fois que tu n'en as plus besoin.
    ca rejoint ce que je te disait au debut.

    @+
    Someday I will be the most powerful Jedi !

    Freddyboy - Blog

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

Discussions similaires

  1. Comment rafraichir mes objets avec un Timer?
    Par wizman2 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 23/02/2007, 16h10
  2. Comment optimiser une Requete avec Count ?
    Par tavarlindar dans le forum Requêtes
    Réponses: 15
    Dernier message: 09/02/2007, 21h19
  3. Réponses: 2
    Dernier message: 03/05/2006, 17h00
  4. [ABAP] Comment créer une requête avec jointure
    Par roadster62 dans le forum SAP
    Réponses: 1
    Dernier message: 21/02/2006, 16h04
  5. Optimisation de requête avec Tkprof
    Par stingrayjo dans le forum Oracle
    Réponses: 3
    Dernier message: 04/07/2005, 09h50

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