Suppression table paradox impossible [Résolu]

Messages postés
30
Date d'inscription
samedi 16 octobre 2004
Dernière intervention
12 mai 2010
- - Dernière réponse : mengele
Messages postés
30
Date d'inscription
samedi 16 octobre 2004
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...
Afficher la suite 

Votre réponse

9 réponses

Meilleure réponse
Messages postés
1293
Date d'inscription
mardi 28 octobre 2003
Statut
Contributeur
Dernière intervention
3 juillet 2015
3
Merci
Salut,

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

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

(Penser à rouvrir la session après)

Simon

Merci sp40 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 105 internautes ce mois-ci

Commenter la réponse de sp40
Messages postés
1293
Date d'inscription
mardi 28 octobre 2003
Statut
Contributeur
Dernière intervention
3 juillet 2015
3
Merci
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

Merci sp40 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 105 internautes ce mois-ci

Commenter la réponse de sp40
Messages postés
4996
Date d'inscription
dimanche 26 février 2006
Dernière intervention
27 mars 2018
0
Merci
Bonjour,
juste avant le close final, essaie de lancer une déconnexion.

cantador
Commenter la réponse de cs_cantador
Messages postés
30
Date d'inscription
samedi 16 octobre 2004
Dernière intervention
12 mai 2010
0
Merci
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
Commenter la réponse de mengele
Messages postés
30
Date d'inscription
samedi 16 octobre 2004
Dernière intervention
12 mai 2010
0
Merci
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.
Commenter la réponse de mengele
Messages postés
30
Date d'inscription
samedi 16 octobre 2004
Dernière intervention
12 mai 2010
0
Merci
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...
Commenter la réponse de mengele
Messages postés
4996
Date d'inscription
dimanche 26 février 2006
Dernière intervention
27 mars 2018
0
Merci
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
Commenter la réponse de cs_cantador
Messages postés
30
Date d'inscription
samedi 16 octobre 2004
Dernière intervention
12 mai 2010
0
Merci
[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.
Commenter la réponse de mengele
Messages postés
30
Date d'inscription
samedi 16 octobre 2004
Dernière intervention
12 mai 2010
0
Merci
à la main*

(oula, faut que j'arrête de me coucher trop tard moi)
Commenter la réponse de mengele

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.