mengele
Messages postés29Date d'inscriptionsamedi 16 octobre 2004StatutMembreDernière intervention12 mai 2010
-
28 juil. 2008 à 12:49
mengele
Messages postés29Date d'inscriptionsamedi 16 octobre 2004StatutMembreDernière intervention12 mai 2010
-
29 juil. 2008 à 12:57
Bonjour,
j'aimerais savoir comment "libérer" une table paradox (.db) : matable.db
Dans mon appli je n'ai qu'un TQuery : MonQuery.
Cette table matable.db est créé à l'issue de "create table..." avec MonQuery (close, puis execsql).
dans la suite du programme :
MonQuery.DataBaseName : l'emplacement où se trouve matable.db
MonQuery.Sql.text : select * from matable;
MonQuery.Close;
MonQuery.Open;
// ensuite je fais des fieldsbyname, des insert/edit...
Toute à la fin du programme :
MonQuery.Close;
DeleteFile({emplacement}\matable.db)
...
Seulement voilà, le fichier ne peut pas être supprimer avant la "terminaison" de toute l'application. D'ailleurs, pdt que l'appli tourne, je ne peux pas non plus le supprimer manuellement (clic droit + supp, ou delete depuis cmd), ni même l'écraser !
Dans l'administrateur bde, j'ai un alias standard/paradox, qui pointe vers monemplacement. Je ne m'en sers pas dans l'appli (en supprimant l'alias ça changera qqchose ?).
Qu'est-ce qui fait que le fichier encore utilisé, alors que j'ai fait un MonQuery.Close, et que lui seul utilisait la table.
Faut-il faire carrément un free du tquery ?
Ou sinon, y a-t-il un moyen (pas trop long de préférence :) ) de forcer la suppression du fichier, ou de tuer le processus du driver paradox, ou alors couper le pipe ou jsais pas... ?
sp40
Messages postés1276Date d'inscriptionmardi 28 octobre 2003StatutContributeurDernière intervention 3 juillet 201515 28 juil. 2008 à 19:46
Tu peux essayer avec un query créé dynamiquement au lieu d'utiliser un composant TQuery :
With TQuery.Create(nil) do begin
DatabaseName := [ton alias ou le chemin de ta table]
SQL.Add(...);
Open; (pour un Select) ou ExecSQL;
Free;
end;
Normalement, après le free, tu dois pouvoir supprimer ta table
mengele
Messages postés29Date d'inscriptionsamedi 16 octobre 2004StatutMembreDernière intervention12 mai 2010 28 juil. 2008 à 14:51
Merci pour vos réponses les gars [auteur/SIMONPELLOQUIN/185902.aspx simonpelloquin] et cantador.
Effectivement je peux à présent supprimer le fichier matable.db.
Mais en fait, c'était qu'une appli de test. De 10-15 lignes donc :D
Et en fait j'aimerais intégrer ce MonQuery dans une application bien plus grosse.
Et le hic, c'est qu'entre l'ouverture et la fermeture de MonQuery, j'ai un autre DataSet (MonMechantQuery, qui est un tquery aussi) qui doit rester ouvert, ce qui fait que après un :
------------
MonMechantQuery reste fermé (je perds le résultat de sa requête et l'enregistrement sur lequel il pointait...). Sachant qu'il doit rester en state dsEdit pendant toute ma manip sur TQuery, et ce jusqu'au post.
Y aurait pas moyen de faire un Session.close juste pour TQuery... ou mieux (), que font exactement Session.Close et Application.ProcessMessages à MonQuery et à MonMechantQuery ?
Merci
Vous n’avez pas trouvé la réponse que vous recherchez ?
mengele
Messages postés29Date d'inscriptionsamedi 16 octobre 2004StatutMembreDernière intervention12 mai 2010 28 juil. 2008 à 15:47
Effectivement, j'ai encore vérifié, y a pleins d'autres dataset dans des états insert ou edit pendant le session.close.
Donc je peux pas me le permettre, dommage...
Y aurait pas moyen de cibler la fermeture de session uniquement sur les paradox.
Session.CloseDatabase(la_database_qui_pointe_sur_{emplacement}) ça marcherait ?
mengele
Messages postés29Date d'inscriptionsamedi 16 octobre 2004StatutMembreDernière intervention12 mai 2010 28 juil. 2008 à 15:48
Ouais je viens de voir encore une fois, l'appli sur laquelle je bosse fait dans les 300 000 lignes. Et lorsque je fais mon Session.close, il y a énormément de dataset qui sont dans des états genre Edit, Insert,... c'est un peu le bordel ouais... mais c'est pas moi qui l'aie faite :p (tout ça pour avoir un menu "Fenêtre" comme ça on peut faire plusieurs trucs en même temps).
Donc ça serait bien s'il existait un truc du même genre en pouvant cibler que la session paradox ou un truc comme ça...
cs_cantador
Messages postés4720Date d'inscriptiondimanche 26 février 2006StatutModérateurDernière intervention31 juillet 202113 28 juil. 2008 à 19:51
oui, çà doit pas être évident..
Si tu pouvais régrouper tous tes datasets dans plusieurs datamodules
avec des boucles tu pourrais alors tous les ouvrir ou les fermer proprement
sinon çà va être galère à gérer, car si 1 seul reste ouvert de temps en temps patatra..
Evidemment, je te propose pas de refaire le programme sous interbase...
mengele
Messages postés29Date d'inscriptionsamedi 16 octobre 2004StatutMembreDernière intervention12 mai 2010 29 juil. 2008 à 10:30
[auteur/SIMONPELLOQUIN/185902.aspx salut simonpelloquin],
effectivement en procédant comme t'as proposé, c'est-à-dire avec composants dynamiques, le fait de faire un free a superbement coupé la liaison avec mon alias.
Donc ça marche. J'ai du faire pareil pour tous les composants utilisant l'alias (y compris les TUpdateSQL associés aux TQuery). Heureusement qu'il n'y avait qu'une seule TForm utilisant l'alias.
Peut-être le fait de faire des Create/Free, plutôt que des Show/Close sur ma TForm aurait aussi pu résoudre le problème.
Mais y avait pas 50 composants donc ça a pas été trop long de coder les objets à la maison (sauf pour les TUpdateSQL, un peu lourde la TStringList).