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++Builder Discussion :

les composants ADO


Sujet :

C++Builder

  1. #1
    Membre �clair�
    Inscrit en
    Avril 2008
    Messages
    335
    D�tails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 335
    Par d�faut les composants ADO
    bonjour tout le monde
    pour la premi�re fois je veut utiliser les composant ADO pour interroger ma base de donn�es access via c++ builder.
    j'explique un peut mon code:

    j'ai deux base de donn�es: la premi�re contient les param�tres et le chemin de ma base de donn�es qui contient mes donn�es. le deuxi�me contient mes donn�es.
    pour cela j'ai cr�e deux ADOConnection dans DataModule. voici le code:
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    AnsiString Chemin1,Chemin2;
    AnsiString cheminBD1="C:\\Options.mdb";
     
     
          if(FileExists(cheminBD1))
     
                {
                  DataModule1->ADOConnection1->Close();
                     Chemin1 ="Provider=Microsoft.Jet.OLEDB.4.0;"
            "Data Source= "+ cheminBD1+";"+
            "User Id=admin;Password=;";
     
     DataModule1->ADOConnection1->LoginPrompt=false;
     DataModule1->ADOConnection1->ConnectionString =Chemin1;
    DataModule1->ADOConnection1->Open();
     
                     DataModule1->Param->Open();
                     DataModule1->Param->First();
                     AnsiString cheminBD2 =DataModule1->Param->FieldByName("Libellé")->AsString+DataModule1->Param->FieldByName("Libellé1")->AsString;
                     DataModule1->ADOConnection2->Close();
                      Chemin2 ="Provider=Microsoft.Jet.OLEDB.4.0;"
            "Data Source= "+ cheminBD2+";"+
            "User Id=admin;Password=;";
     
     DataModule1->ADOConnection2->LoginPrompt=false;
     DataModule1->ADOConnection2->ConnectionString = Chemin2 ;
     DataModule1->ADOConnection2->Open();
      DataModule1->Query1->Open();
                    //  Edit2->Text=Chemin;
     
     
                }
     
                else
        {
     
         int rep=MessageBox(Handle,"Base de données introuvable","logiciel",MB_ICONSTOP ) ;
     
        }
    j'ai ulilis�e ce code a l'entr� de l'application il fonctionne mais il prend du temps pour que la fen�tre apparaitre (je pense qu'il d�pend de volume de la BDD)
    comment je peut r�gler ce probl�me, merci d'avance

  2. #2
    Expert �minent
    Avatar de ShaiLeTroll
    Homme Profil pro
    D�veloppeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 44
    Localisation : France, Seine Saint Denis (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur C++\Delphi
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 089
    Par d�faut
    La fen�tre lente � survenir est-ce MessageBox ?
    Si oui, c'est donc le FileExists qui est lent ? un anti-virus ?
    Pense que des fichiers � la racine du C: en Seven\Vista, c'est tr�s mal vu (l'UAC peut en refuser l'acc�s)

    Si non, quelle fen�tre ? une autre dont on a pas le code cr�� APRES l'ouverture du DataModule
    Si ta DB est sur le r�seau Query1->Open(); va charger la tableau en m�moire, donc la lire, donc consommer temps et RAM
    Evidemment plus la table est grosse plus cela sera lent !
    Si ta DB est locale, il est possible que cela soit le m�me comportement, un TADOTable pour y rem�dier

    le TADOTable pour ADO\ACCESS doit fournir un �quivalent du TTable BDE\Paradox qui g�rait la table comme un fichier sans charger le contenu en m�moire (avec un NetDir bien configur�).
    Faudrait le v�rifier, je n'ai utilis� ADO mais avec ORACLE qu'une seule fois et tout en TADOQuery � part quelques tables syst�mes minuscules !
    Cela doit d�pendre du Driver !
    ACCESS je n'ai jamais exp�riment�, je suppose que c'est un mode Fichier vu qu'il n'y a pas de serveur !

    le TQuery avait le m�me probl�me de lenteur, il cr�ait un fichier temporaire dans le WorkDir contenant le r�sultat issu SQL puis le chargeait mais �a c'est le probl�me du SQL en g�n�ral qui charge le recordset obtenu (il y a des techniques d'optimisation en DBExpress � ce sujet)

    Ton code est tr�s mal indent�, cela complique notre lecture !
    Comme tu as fait un FileExists pour la base locale, tu aurais pu faire de m�me pour la 2eme ?

    Libell� contient le Chemin genre \\Server\Dossier\Dossier\
    Libell�1 contient le Nom du Fichier
    Il ne manquerait pas un \ entre les deux ? utilise IncludeTrailingPathDelimiter

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
      AnsiString Chemin1,Chemin2;
      AnsiString cheminBD1="C:\\Options.mdb";
     
     
      if(FileExists(cheminBD1))
      {
        DataModule1->ADOConnection1->Close();
        Chemin1 ="Provider=Microsoft.Jet.OLEDB.4.0;"
           "Data Source= "+ cheminBD1+";"+
           "User Id=admin;Password=;";
     
        DataModule1->ADOConnection1->LoginPrompt=false;
        DataModule1->ADOConnection1->ConnectionString =Chemin1;
        DataModule1->ADOConnection1->Open();
     
        DataModule1->Param->Open();
        DataModule1->Param->First();
     
        AnsiString cheminBD2 = 
          IncludeTrailingPathDelimiter(DataModule1->Param->FieldByName("Libellé")->AsString)
          + DataModule1->Param->FieldByName("Libellé1")->AsString;
     
        if(FileExists(cheminBD2))
        {
          DataModule1->ADOConnection2->Close();
          Chemin2 ="Provider=Microsoft.Jet.OLEDB.4.0;"
             "Data Source= "+ cheminBD2+";"+
             "User Id=admin;Password=;";
     
          DataModule1->ADOConnection2->LoginPrompt=false;
          DataModule1->ADOConnection2->ConnectionString = Chemin2 ;
          DataModule1->ADOConnection2->Open();
          DataModule1->Query1->Open();
          ...
        }
        else
          MessageBox(Handle, "Base de données introuvable", "logiciel", MB_ICONSTOP);
      } 
      else
        MessageBox(Handle, "Options introuvables", "logiciel", MB_ICONSTOP);
    MessageBox, tu es comme mes coll�gues, il pr�f�re (par m�connaissance) cette forme archa�que utilisant du char* ou wchar_t* � la Dialogs.MessageDlg qui �vite de se prendre la t�te !
    Aide via F1 - FAQ - Guide du d�veloppeur Delphi devant un probl�me - Pensez-y !
    Attention Troll M�chant !
    "Quand un homme a faim, mieux vaut lui apprendre � p�cher que de lui donner un poisson" Confucius
    Mieux vaut se taire et para�tre idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la m�diocrit� !

    L'exp�rience, c'est le nom que chacun donne � ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre �clair�
    Inscrit en
    Avril 2008
    Messages
    335
    D�tails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 335
    Par d�faut
    merci ShaiLeTroll pour ta r�ponse

    je suis sous XP et ma BDD est locale, la fen�tre n'est pas MessageBox, (contient les donn�es de la table)

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    quelle fenêtre ? une autre dont on a pas le code créé APRÈS l'ouverture du DataModule
    j'ai constat�e que la lenteur de la fen�tre d�pendre de la taille de la table
    est ce qu'il y a un moyen de r�gler ce probleme

  4. #4
    Expert �minent
    Avatar de ShaiLeTroll
    Homme Profil pro
    D�veloppeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 44
    Localisation : France, Seine Saint Denis (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur C++\Delphi
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 089
    Par d�faut
    Tu as un peu lu ma r�ponse ou tu t'es arr�t� � la ligne 4 ?

    As-tu tent� un TADOTable au lieu d'un TADOQuery ?
    Si je te propose des pistes c'est pour que tu les essayes et que tu fasses un retour dessus !

    Si cela ne r�soud pas le probl�me, c'est surement li� � ADO qui m�me en mode Table sur ACCESS copie l'ensemble des donn�es dans le RecordSet contrairement au BDE\Paradox

    Citation Envoy� par faniette Voir le message
    j'ai constat�e que la lenteur de la fen�tre d�pendre de la taille de la table
    Comme je l'ai d�j� �crit :

    Citation Envoy� par ShaiLeTroll Voir le message
    Query1->Open(); va charger la tableau en m�moire, donc la lire, donc consommer temps et RAM
    Evidemment plus la table est grosse plus cela sera lent !
    Pourquoi parles-tu de la lenteur de la fen�tre ???
    As-tu mesur� les temps de chaque tache avec un QueryPerformanceCounter pour chercher l'�l�ment lent au lieu de figer sur l'apparition d'une fen�tre !
    Tu vois la cons�quence mais pas pleinement la cause !
    Soit plus pr�cise dans ton analyse !

    C'est le Open qui prend du temps car il fait une copie en m�moire des donn�es

    Apr�s, si ta fen�tre contient une Grille
    Si TDBGrid, c'est instantan�
    Si TStringGrid, cela recopie encore

    Ouvrir une Table enti�rement au d�marrage de l'application est une mauvaise pratique !
    Mieux vaut r�cup�rer juste le ou les enregistrements n�cessaires au moment utile !
    Quel est le besoin ?
    Aide via F1 - FAQ - Guide du d�veloppeur Delphi devant un probl�me - Pensez-y !
    Attention Troll M�chant !
    "Quand un homme a faim, mieux vaut lui apprendre � p�cher que de lui donner un poisson" Confucius
    Mieux vaut se taire et para�tre idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la m�diocrit� !

    L'exp�rience, c'est le nom que chacun donne � ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Membre �clair�
    Inscrit en
    Avril 2008
    Messages
    335
    D�tails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 335
    Par d�faut
    bonjour
    merci SaileTroll
    avec TADOTable j'ai pas ce probl�me, et je mesure pas le temps de chaque tache, en effet ce qui me d�range quand je lance une fen�tre qu'elle contient les informations de ADOQuery dans DBGrid, elle prend de temps pour quelle s'affiche.
    Query1->Open(); va charger la tableau en m�moire, donc la lire, donc consommer temps et RAM
    Evidemment plus la table est grosse plus cela sera lent !
    alors je peut rien faire.

  6. #6
    Expert �minent
    Avatar de ShaiLeTroll
    Homme Profil pro
    D�veloppeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 44
    Localisation : France, Seine Saint Denis (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur C++\Delphi
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 089
    Par d�faut
    Avec le TADOQuery, non il n'y a pas de solution, il faut faire de SQL qui renvoie un jeu limit� d'enregistrements c'est le probl�me de tout mode SQL !

    Tu utilises ACCESS, ce n'est pas un vrai SGBD, conserve le TADOTable si celui est performant !
    R�serve le TADOQuery pour des stats comme COUNT, SUM ou pour r�cup�rer sur des enregisrements avec un WHERE sur PrimaryKey ou ForeignKey

    Pense que l'on peut aussi limiter le nombre d'enregistrement, je ne connais pas ce que propose ACCESS,
    MySQL, il y a LIMIT,
    SQL Server, c'est TOP
    Utilise pour un outil de recherche, r�cup�rer les 100 premiers par exemple (avec certains SGBD, tu peux r�cup�rer les 100 premiers mais avec le nombre r�el d'enregistrement disponible)
    Aide via F1 - FAQ - Guide du d�veloppeur Delphi devant un probl�me - Pensez-y !
    Attention Troll M�chant !
    "Quand un homme a faim, mieux vaut lui apprendre � p�cher que de lui donner un poisson" Confucius
    Mieux vaut se taire et para�tre idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la m�diocrit� !

    L'exp�rience, c'est le nom que chacun donne � ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  7. #7
    Membre Expert
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activit� : Responsable de compte
    Secteur : High Tech - Op�rateur de t�l�communications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Billets dans le blog
    1
    Par d�faut
    Hello
    on peut am�liorer notament la perfrormance en utilisant un composant TAdoQuery en menttant la propri�t� Prepared de ce composant � True avantg de proc�der � l'appel de ma m�thode Open



    ci-dessous un code d'exemple qui dans le contructeur d'une fiche initialise le contenu d'une combobox avec le contenu d'une Table

    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
     
    TADOQuery *ADOQuery= new TADOQuery(NULL);
      ADOQuery->Connection=Dm->ADOConnection1;  // Dm est mon dataModule
      ADOQuery->SQL->Add("Select * from tbUser");
      ADOQuery->Prepared=true;
      ADOQuery->Active=true; // ou ADOQuery->Open();
      if(ADOQuery->RecordCount)
      {
        while (!ADOQuery->Eof)
        {
          ComboBox1->Items->Add(ADOQuery->Fields->Fields[1]->AsString);
          ADOQuery->Next();
        }
      }
      ComboBox1->Sorted=true;
      delete  ADOQuery;
    cdlt
    vous trouverez mes tutoriels � l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les r�gles du forum

  8. #8
    Expert �minent
    Avatar de ShaiLeTroll
    Homme Profil pro
    D�veloppeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 44
    Localisation : France, Seine Saint Denis (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur C++\Delphi
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 089
    Par d�faut
    @DjmSoftware, Prepared n'est utile qu'avec des Param�tres, ton exemple est incomplet !

    Si Prepared a la valeur True et si le composant ensemble de donn�es est connect� � un stockage de donn�es, ADO pr�pare la commande avant de l'ex�cuter. Cela implique de conserver la partie param�tres de la commande de requ�te dans un tampon distinct pour un acc�s ult�rieur plus rapide, en �vitant l'insertion � chaque fois des param�tres de la requ�te dans la commande.
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    TADOQuery *ADOQuery= new TADOQuery(NULL);
      ADOQuery->Connection=Dm->ADOConnection1;  // Dm est mon dataModule
      ADOQuery->Text = "Select * from tbUser WHERE UserLogin = :pUserLogin";
      ADOQuery->Prepared := true;
     
      ADOQuery->Parameters->ParamByName('pUserLogin')->AsString := EditLogin->Text;
      ADOQuery->Active=true; // ou ADOQuery->Open();
      ...
    @faniette, quelle volum�trie, �vite de r�cup�rer plus de 10000 enregistrements par un TADOQuery
    Apr�s, j'ignore les performances d'ACCESS, je suppose que m�me 10000 c'est d�j� trop, faut peut-�tre se limiter � 1000
    Aide via F1 - FAQ - Guide du d�veloppeur Delphi devant un probl�me - Pensez-y !
    Attention Troll M�chant !
    "Quand un homme a faim, mieux vaut lui apprendre � p�cher que de lui donner un poisson" Confucius
    Mieux vaut se taire et para�tre idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la m�diocrit� !

    L'exp�rience, c'est le nom que chacun donne � ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

Discussions similaires

  1. R�ponses: 1
    Dernier message: 31/07/2008, 10h42
  2. Requ�te SQL via les composants ADO sur une Table Access 97
    Par Didier100 dans le forum Bases de donn�es
    R�ponses: 9
    Dernier message: 21/12/2007, 14h43
  3. Probl�me avec les composants ADO
    Par elikplim dans le forum Bases de donn�es
    R�ponses: 3
    Dernier message: 31/10/2007, 11h39
  4. les composants ado svp ( delphi6 )
    Par Nadirov dans le forum Delphi
    R�ponses: 2
    Dernier message: 14/08/2006, 21h08
  5. Probl�me Update Base de donn�es avec les composants ADO
    Par lingli dans le forum Bases de donn�es
    R�ponses: 5
    Dernier message: 20/04/2006, 00h41

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