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

Lazarus Pascal Discussion :

TSqlQuery et TDaemon [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Membre actif
    Homme Profil pro
    Business Analyst
    Inscrit en
    Juillet 2005
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Business Analyst
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2005
    Messages : 108
    Points : 234
    Points
    234
    Par défaut TSqlQuery et TDaemon
    Bonjour,

    Sous Windows, j'ai un projet qui est un service (TDaemon). Ce service, doit effectuer un accès à une base de données Oracle.

    La connexion à la base de données se passe sans Pb, mais l'exécution de la requête SQL (un simple select) renvoie systématiquement l'erreur :

    ORA-01062: allocation impossible de mémoire pour le tampon défini

    Cette erreur est générée dès l'exécution du TSqlQuery.Open

    Comme l'accès se fait via un service, il n'y a donc pas de fenêtre d'affichage, ni de grille de résultat, ... Est-ce dû à cela ?

    Je suis preneur de toutes idées sur comment effectuer un accès (requête select) à une base Oracle dans un service Windows.

    Par avance merci.

    Cdt

    Laurent

  2. #2
    Membre expérimenté
    Avatar de chris37
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Juillet 2007
    Messages
    378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France

    Informations professionnelles :
    Activité : Directeur des systèmes d'information
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 378
    Points : 1 688
    Points
    1 688
    Par défaut
    Bonjour

    Peux tu nous donner plus d'info STP ?


    Cordialement,
    Chris

  3. #3
    Membre actif
    Homme Profil pro
    Business Analyst
    Inscrit en
    Juillet 2005
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Business Analyst
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2005
    Messages : 108
    Points : 234
    Points
    234
    Par défaut
    Bonjour,

    J'ai créé une application de type Service, plus exactement Daemon (service) Application (j'ai donc la classe TDaemon qui est instanciée) ainsi que le mapper correspondant (classe TDaemonMapper).

    Au niveau du mapper, l'ai créé un item (Propriété DaemonDefs) qui "pointe" sur l'instance de la classe TDaemon).

    Jusque là, le service s'installe correctement sous Windows, peut être démarré, arrêté, ...

    Ensuite, je rajoute les composants suivants :
    • TOracleConnection
    • TSQLTransaction
    • TSQLQuery


    Au niveau du composant TOracleConnection, j'indique la base de données (instance Oracle), le compte utilisateur et le mot de passe. Je fais les liens entre TOracleConnection et TSQLTransaction.

    Au niveau du composant TSQLQuery, j'indique le lien avec TOracleConnection et je mets une simple requête sql (du style select toto from matable).

    En conception, lorsque je mets les propriétés "Activie" de chaque composant à "True", la requête est correctement exécutée (je le vois au niveau du serveur via Oracle Enterprise Manager). Par contre, à l'exécution, lorsque j'ouvre la requête du TSQLQuery, le message d'erreur apparaît. Cela fait comme si en conception, du fait d'avoir un visuel sur les composants (donc via une fenêtre) tout fonctionnait alors qu'à l'exécution on n'a aucun visuel de fenêtre ...

    J'éi développé une autre petite application en utilisant les mêmes composants d'accès à la base de données et avec les mêmes éléments (instance oracle, compte utilisateur, mot de passe, table) et tout se passe bien. La seule différence dans cette application est que j'ai une interface utilisateur et les données sont correctement affichées.

    En espérant avoir été clair dans les informations.

    Bonne journée.

    Cdt

    Laurent

  4. #4
    Membre expérimenté
    Avatar de chris37
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Juillet 2007
    Messages
    378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France

    Informations professionnelles :
    Activité : Directeur des systèmes d'information
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 378
    Points : 1 688
    Points
    1 688
    Par défaut
    Peut être une piste

    Essaye de ne pas utiliser de composants pour faire cela vu que c'est une appli 100% console. On ne sait jamais vu que le TSqlQuery attend un TDataset pour l'affichage des données

    Crées directement les objets TConnection, TSqlQuery et les autres depuis le code.
    Les paramètres par défaut seront peut être a vérifier...

    Cordialement,
    Chris

  5. #5
    Membre actif
    Homme Profil pro
    Business Analyst
    Inscrit en
    Juillet 2005
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Business Analyst
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2005
    Messages : 108
    Points : 234
    Points
    234
    Par défaut
    Bonjour,

    J'essaie cela dès lundi et te tiens au courant.

    Merci et bon week-end.

    Cdt

    Laurent

  6. #6
    Membre actif
    Homme Profil pro
    Business Analyst
    Inscrit en
    Juillet 2005
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Business Analyst
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2005
    Messages : 108
    Points : 234
    Points
    234
    Par défaut
    Bonjour,

    J'ai essayé en créant les composants directement dans le code et ... même message d'erreur.

    J'ai ensuite rajouté une form que j'ai mise en disponible et que je crée au moment d'en avoir besoin. Cette forme contient les composants d'accès la base de données et ... même message d'erreur.

    Manifestement, il y aurait quelque part une incompatibilité entre la définition d'un service et l'utilisation du composant TSQLQuery.

    Je m'en suis "sorti" autrement : j'ai créé une application "standard" qui contient les accès à la base de données mais dont la fenêtre est mise en minimize. Dans le "onCreate" de la form, je lance le traitement à réaliser sur la base de données.

    Une fois cette application développée (aucune action utilisateur sur la form), depuis le service, j'appelle cette application via la définition d'un TProcess.

    Le service lance alors l'application qui elle-même effectue les accès à la base de données. Cela a été testé sur un serveur et fonctionne correctement.

    Si "l'astuce" peut servir ...

    Cdt

    Laurent

  7. #7
    Membre expérimenté
    Avatar de chris37
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Juillet 2007
    Messages
    378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France

    Informations professionnelles :
    Activité : Directeur des systèmes d'information
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 378
    Points : 1 688
    Points
    1 688
    Par défaut
    Merci pour cette précision mais c'est effectivement curieux !

    As tu testé en utilisant d'autres composants comme Zeos ?

    Cordialement,
    Chris

  8. #8
    Membre actif
    Homme Profil pro
    Business Analyst
    Inscrit en
    Juillet 2005
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Business Analyst
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2005
    Messages : 108
    Points : 234
    Points
    234
    Par défaut
    Bonjour,

    Je ne connaissais pas ces composants. Je vais tester et voir ce que ça donne.

    Merci pour l'info.

    Cdt

    Laurent

  9. #9
    Membre actif
    Homme Profil pro
    Business Analyst
    Inscrit en
    Juillet 2005
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Business Analyst
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2005
    Messages : 108
    Points : 234
    Points
    234
    Par défaut
    Bonjour,

    J'ai chargé et installé les composants ZEOS. Par contre, je ne vais pas pouvoir les utiliser car manifestement ces composants n'accèdent pas à la base de données en "natif" et on est obligé de passer par l'ODBC (mais peut-être que je me trompe !).

    Actuellement, je migre des outils de Delphi vers Lazarus car l'avantage de Lazarus est d'avoir des composants natifs Oracle, ce que Delphi n'a pas.

    Mais cette recherche m'a permis de voir ces composants ZEOS qui sont intéressants pour Delphi et que je vais utiliser par ailleurs ...

    Merci et bonne journée.

    Cdt

    Laurent

  10. #10
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Cela dépend de ce que vous appelez "natif". Si -et c'est le cas le plus usuel- vous accédez à la base sans passer par un driver ODBC ou par OLE DB, mais par la bibliothèque native de la base de données (libmysql.dll par exemple) alors Zeos -dont je suis un grand supporter- fait du "natif"... Je trouve ses composants plutôt fiables et plutôt rapides (un bémol sur le SQLite pour ce dernier aspect). Un problème également de rafraîchissement si le ZQuery couplé à un DataSource est dans un Thread* (mais ce n'est pas usuel comme procédure). Sinon sous mySQL, PostgreSQL et SQLite (y compris hébergés pour les 2 premiers), j'en suis très satisfait. Mon dernier test (il y a un peu plus d'un an) avait montré que les composants "natifs" de Lazarus d'accès aux bases (ie ceux fournis avec Lazarus) étaient en progrès...

    Un petit bémol peut-être pour Zeos : le comportement sous Mac... Je n'en dispose plus mais à l'époque sous Mac OS X, il m'a été impossible d'installer proprement Zeos... et là jai découvert des failles dans les composants natifs de Lazarus... mais qui n'existent plus ou sont contournables maintenant... enfin pour celles que j'avais détectées.

    Cordialement. Gilles

    * Quand j'ai lu votre question, j'ai pensé dans un premier temps à ce problème de Thread que j'ai rencontré. Je ne suis pas un spécialiste des services (TDaemon) et je ne sais pas comment ils fonctionnent précisément... mais comme normalement ils sont isolés, je suppose qu'ils tournent chacun dans un Thread. Bref, j'ai préféré ne pas vous faire perdre votre temps et laissé des collègues plus pointus vous orienter. Mais si vous avez le temps, vous pouvez éventuellement vérifier cette hypothèse car le zQuery (le DatsaSet) n'est pas en cause, c'est l'association zQuery-DataSource qui l'était dans mon cas.. plus exactement la phase de réactualisation du DataSource par le DataSet qui n'est pas compatible avec la programmation des Threads... (ou nécessite une "dé"programmation du composant -non maintenable donc) et je suppose que l'association DataSet-DataSource native présente les mêmes problèmes. J'ai utilisé une simple chaîne "Zconnect-ZQuery-StringGrid" et là pas de problème pour l'encapsuler dans un Thread.
    Dernière modification par Invité ; 05/07/2011 à 16h38.

  11. #11
    Membre actif
    Homme Profil pro
    Business Analyst
    Inscrit en
    Juillet 2005
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Business Analyst
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2005
    Messages : 108
    Points : 234
    Points
    234
    Par défaut
    Bonjour,

    J'entends par "natif" d'indiquer directement une instance de base de données en indiquant le type de base de données. Par exemple, le composant TOracleConnection recherche directement le fichier TNSNAME.ORA pour avoir les informations de connexion à l'instance de base de données telle qu'indiquée dans la propriété DataBaseName du composant. Ensuite, ce sont les librairies du client ORACLE qui sont utilisées.

    Sous Delphi, j'utilise les composants UIB qui sont spécifiques pour Firebird. Il suffit juste d'indiquer la base de données ainsi que la librairie cliente à utiliser (par contre, avec les composants IBX, il n'y a que la base de données à indiquer, la librairie client étant automatiquement prise en compte).

    Lors de mon test avec les composants ZEOS, je n'ai pas vu cette possibilité d'indiquer directement l'instance de la base de données.

    Actuellement avec Lazarus, je réalise des tests d'accès à une base de données Oracle (Version 10G) afin de ne plus être obligé de passer par des DSN utilisant le driver ODBC de ORACLE, tests réalisés soit à partir d'une application avec interface utilisateur, soit en utilisant des services Windows. Le seul problème que je rencontre est sur un service devant accéder à la base de données. Je pense que le problème vient du fait que le service n'a aucune référence visuelle d'où un problème d'affectation mémoire mais ces développements n'étant pas prioritaires pour le moment, je n'ai pas poussé plus loin les débug et recherches dans les codes pour voir ce qu'il se passe (qui plus est, le débug d'un service est quasiment .... infaisable en mode pas à pas). Comme le service ne contient aucune interface visuelle, je débug avec des traces de fichiers log.

    Mais, comme je l'ai dit, je n'ai peut être pas utilisé correctement les composants ZEOS. Je pousserais éventuellement plus en avant les tests mais ayant trouvé une solution de contournement qui fonctionne ... Mais rien que pour ma curiosité, je pousserais les tests.

    Bonne fin de journée.

    Cdt

    Laurent

  12. #12
    Invité
    Invité(e)
    Par défaut
    Rebonjour,

    Dans ce cas, votre description de natif semble "correspondre" à celle de Zeos et si l'on en croit la maigre information sur le Web, cela a fonctionné en natif avec Oracle 9... même s'il existe encore des bugs. Mais ce ne sont que des lectures, je ne pratique pas Oracle et n'ai pas de connaissance exploitable en la matière... J'ai lu que le "driver Oracle" était l'un des derniers développés chez Zeos. Ceci explique peut-être cela. D'autant, qu'avant sa version Express gratuite, Oracle était réservé de par son prix et son approche -enfin à ce qu'on peut également en lire- aux entreprises disposant de moyens financiers mais surtout informatiques (humains et matériel)... et je doute qu'une majorité (voire même une minorité signifiante) de ce genre d'entreprises utilise Zeos... ou Lazarus... Delphi peut-être. Bref, ceci explique certainement le manque de documentations "externes" sur le couple Zeos/Oracle. Mais, ceci dit, tout apport à la communauté Lazarus est le bienvenu. Donc si vous avez le temps de tester, c'est intéressant.

    Je me rappelle également avoir développé avec Lazarus (en 0.9.26) et Zeos 6.6.4 + mySQL un "espèce" (ie sans TDaemon) de service pour Windows et j'avais rencontré des problèmes : certaines unités Zeos nécessaires manquaient -sans message d'erreur- et je crois même que leur déclaration nécessitait un ordre spécifique. Je regarderai si je dispose encore du source.

    Enfin toujours dans la lecture, il semblerait que le TDaemon (voir la réponse de M. Gaertner) soit en réalité un TDataModule. Mais pour les spécificités, il faut aller voir Chris, l'auteur du lien précédent; Et des spécificités, il y en a, même si elles ne sont pas clairement énoncées : je n'utilise pas non plus les TDataModules ayant rencontré des problèmes, notamment avec plusieurs zQueries reliés à un seul zConnect alors que le problème ne se posait pas avec les composants diposés sur une TForm "classique". Là encore, la configuration était un peu particulière : un ping permament pour le zConnect sur une base internet hébergée (fonction très utile des Zeos pour les connexions distantes), des Zqueries en prise permanente pour alimenter des dbGrids en temps réel et des zQueries "ponctuels" pour modifier des données des dbGrids affichées. Ce qui induirait probablement des relations spécifiques avec les composants d'accès aux bases.

    Bonne soirée.
    Cordialement. Gilles
    Dernière modification par Invité ; 05/07/2011 à 19h03.

  13. #13
    Membre expérimenté
    Avatar de chris37
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Juillet 2007
    Messages
    378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France

    Informations professionnelles :
    Activité : Directeur des systèmes d'information
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 378
    Points : 1 688
    Points
    1 688
    Par défaut
    Pour Oracle, il suffir juste d'installer le client oracle sur le poste de travail et de configurer le tnsname.ora depuis l'interface.

    Et je peux vous dire que ca fonctionne car je l'ai testé sur une base de plus de 900 tables avec les composant natif de Lazarus pour une grosse boite et que ca tourne au poil

    Cordialement,
    Chris

  14. #14
    Membre actif
    Homme Profil pro
    Business Analyst
    Inscrit en
    Juillet 2005
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Business Analyst
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2005
    Messages : 108
    Points : 234
    Points
    234
    Par défaut
    Bonjour,

    J'ai le client ORACLE installé (ORACLE 10) et le TNSNAMES.ORA est correctement renseigné avec l'instance de la base de données, aussi bien sur mon PC (qui contient aussi Oracle SQL Developper) que sur le serveur.

    Maintenant, comme je l'ai indiqué, je n'ai sûrement pas dû utiliser correctement les différentes propriétés des composants ZEOS lors du peu de tests que j'ai réalisé. Mais comme ces développements ne sont pas prioritaires par rapport à mon quotidien, je ne peux pas, malheureusement, passer beaucoup de temps dessus par jour (ce que je regrette !).

    J'ai mis en place une solution de rechange qui fonctionne mais ne m'avoue pas vaincu et j'espère bien pouvoir approfondir le sujet de ZEOS. Maintenant, comme je l'ai indiqué, c'est pour accéder à la base de données via un service windows, donc sans aucun composants visuel d'affichage des données ... mais je continuerais mes investigations et vous tiendrais informés.

    En tout cas, merci pour ces échanges et informations.

    bonne jourée.

    Cdt

    Laurent

  15. #15
    Membre actif
    Homme Profil pro
    Business Analyst
    Inscrit en
    Juillet 2005
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Business Analyst
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2005
    Messages : 108
    Points : 234
    Points
    234
    Par défaut
    Bonjour,

    Je suis un gros BOULET

    Une réunion décalée m'a permis de refaire des tests des composants ZEOS. Et tout fonctionne parfaitement. A condition d'indiquer le ... protocole ce que je n'avais pas fait précédemment !

    Dans mon service windows (objet TDaemon), j'utilise donc directement les composant ZEOS et la requête SQL ne met pas de message d'erreur d'allocation mémoire comme avec les composants TOracleConnection et TSQLQuery. Tout fonctionne parfaitement.

    Merci pour vos échanges et votre patience.

    Bonne journée.

    Cdt

    Laurent

  16. #16
    Membre expérimenté
    Avatar de chris37
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Juillet 2007
    Messages
    378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France

    Informations professionnelles :
    Activité : Directeur des systèmes d'information
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 378
    Points : 1 688
    Points
    1 688
    Par défaut
    On a l'habitude.................................

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

Discussions similaires

  1. TsqlQuery et récupération de valeur générée
    Par Lucien dans le forum Bases de données
    Réponses: 2
    Dernier message: 19/10/2005, 14h44
  2. TSQLQuery et recordcount
    Par Cybher dans le forum C++Builder
    Réponses: 5
    Dernier message: 30/08/2005, 09h51
  3. problème avec le composant TSQLQuery
    Par vbcasimir dans le forum Bases de données
    Réponses: 6
    Dernier message: 31/05/2005, 16h45
  4. [TSqlQuery+dbexpress] Pbs Insertion
    Par fred64 dans le forum Bases de données
    Réponses: 2
    Dernier message: 11/05/2004, 13h07
  5. [DEBUTANT] TSqlQuery & requête simple
    Par fred64 dans le forum Bases de données
    Réponses: 3
    Dernier message: 21/04/2004, 11h35

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