2009-12-07 16 views
2

Ma question est très simple. J'ai un TClientDataSet qui est lié à un TADOQuery via un TDataSetProvider. Je peux mettre des données dans le TClientDataSet à partir de TADOQuery, mais comment puis-je récupérer les données du TClientDataSet dans le TADOQuery?Interrogation d'un TClientDataSet à l'aide d'un TADOQuery

Les données sont automatiquement transférées de TADOQuery vers TClientDataSet lorsque j'exécute une requête, puis définissez la propriété Active de TClientDataSet sur True, mais si je désactive TADOQuery et que je l'active à nouveau, comment puis-je récupérer les données à partir du TClientDataSet?

Je cours la même requête sur plusieurs bases de données et en utilisant le TClientDataSet pour concaténer les résultats. Cela fonctionne bien. Mon problème maintenant est que je dois obtenir le jeu de résultats concaténés de TClientDataSet dans le TADOQuery afin que je puisse utiliser la procédure SaveToFile de TADOQuery (pour des raisons de compatibilité). Comment puis-je faire ceci?

Répondre

0

J'ai à peu près fini de regarder ça. Mon application permet à l'utilisateur de générer des rapports en interrogeant leurs bases de données. Je peux obtenir ceci pour travailler et c'est très efficace pour de petits ensembles de résultats - cependant, comme c'est une application de rapport, et il est tout à fait possible que des centaines de milliers d'enregistrements puissent être retournés, utilisant un ClientDataSet donne des problèmes de performance massifs. Une fois que vous avez dépassé les 50 000 enregistrements (ce qui est raisonnable, compte tenu de la clientèle), le traitement commence à augmenter de façon exponentielle, ce qui n'est plus d'actualité.

+0

L'avez-vous essayé avec MidasSpeedFix et FastMM4? http://andy.jgknet.de/blog/?p=437 De même, si vous n'avez pas besoin d'écrire des modifications dans la base de données, désactivez le ChangeLog pour améliorer les performances. – RichardS

+0

Oui. J'ai essayé ça. À moins que je fasse quelque chose de mal, cela n'a pas beaucoup changé le temps de traitement. Pour le moment, TADOQuery peut exécuter une requête qui renvoie 450 000 enregistrements et l'enregistre dans un fichier en moins de 4 minutes. Le traitement TClientDataSet s'est bien passé pendant 30 minutes, à quel point j'ai dû fermer l'application de test. Pour obtenir les résultats dont j'ai besoin, je conserve mon traitement existant et j'analyse le document XML (ADOQuery.SaveToFile) et concatène manuellement les données. – Jeedee

0

Je ne fais pas TADOQuery car j'utilise dbExpress, mais j'imagine que l'on doit utiliser la même technique. Après avoir publié vos modifications dans TClientDataSet, appelez 'ApplyUpdates (0)', qui transfère les données du jeu de données client à son fournisseur.

+0

Malheureusement, cela ne fonctionne pas. J'ai essayé d'appeler ApplyUpdates, ce qui ne m'a pas causé d'erreur, mais n'a pas mis à jour le TADOQuery (même nombre d'enregistrements que lors de la mise à jour). J'ai supposé que c'était juste en mettant à jour le DataSetProvider (entre le ClientDataSet et ADOQuery) donc j'ai essayé d'appeler aussi ApplyUpdates sur cela. Cela m'a donné une erreur ("Missing Connection ou ConnectionString"). J'ai alors placé la chaîne de connexion d'ADOQuery à "Provider = MSDAOSP.1; Persist Security Info = False" et j'ai essayé encore, mais ai alors eu une autre erreur ("l'objet ou le fournisseur n'est pas capable d'effectuer l'opération demandée") – Jeedee

0

Vous pouvez toujours réécrire l'ensemble de données dans une table temporaire, puis l'interroger. Aie!!

+0

idée. Un grand nombre de demandes de rapports le font et c'est considéré comme une bonne approche. – Pmax