Suppression table paradox impossible

Résolu
mengele Messages postés 29 Date d'inscription samedi 16 octobre 2004 Statut Membre Dernière intervention 12 mai 2010 - 28 juil. 2008 à 12:49
mengele Messages postés 29 Date d'inscription samedi 16 octobre 2004 Statut Membre Dernière intervention 12 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... ?

Merci pour vos réponses.

PS : même problème en passant par des DBASE...

9 réponses

sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
28 juil. 2008 à 14:08
Salut,

Essaie de rajouter:
Session.Close;
Application.ProcessMessages;

entre le
MonQuery.Close; et DeleteFile({emplacement}\matable.db)

(Penser à rouvrir la session après)

Simon
3
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
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

Simon
3
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
28 juil. 2008 à 14:01
Bonjour,
juste avant le close final, essaie de lancer une déconnexion.

cantador
0
mengele Messages postés 29 Date d'inscription samedi 16 octobre 2004 Statut Membre Dernière intervention 12 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.Close;
MonMechantQuery.Open;
MonMechantQuery.locate(...);
MonMechantQuery.Edit;

...// il se passe pas mal de trucs

Session.close;
application.processmessages;
deletefile({emplacement}\matable.db);
Session.open;

...// il se passe pas mal de trucs

MonMechantQuery.Post;
MonMechantQuery.Close;

------------
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mengele Messages postés 29 Date d'inscription samedi 16 octobre 2004 Statut Membre Dernière intervention 12 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 ?

Merci.
0
mengele Messages postés 29 Date d'inscription samedi 16 octobre 2004 Statut Membre Dernière intervention 12 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...
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
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...

cantador
0
mengele Messages postés 29 Date d'inscription samedi 16 octobre 2004 Statut Membre Dernière intervention 12 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).

Merci simon et cantador.
0
mengele Messages postés 29 Date d'inscription samedi 16 octobre 2004 Statut Membre Dernière intervention 12 mai 2010
29 juil. 2008 à 12:57
à la main*

(oula, faut que j'arrête de me coucher trop tard moi)
0
Rejoignez-nous