Bonjour,
Je travaille sous Delphi 7 avec les composants FIBPlus 6.8 + EHLib pour accéder à une DB Firebird 2.1.
Voici mon problème :
- Je dois creer dynamiquement plusieurs instances d'une fenêtre permettant chacune de creer/modifier un enregistrement sur plusieurs tables.
- Chaque instance crée dynamiquement son propre DataModule.
- Chaque instance crée/modifie des enregistrements différents.
Lorsque je crée une première instance de la fenêtre tout se passe bien.
Lorsque je crée une deuxième instance, les choses se corsent:
- La première instance qui crée ou modifie les enregistrements (toujours un par table) n'a pas de problèmes.
- Si l'autre instance crée ou modifie d'autres enregistrements (sur les mêmes tables), je reçois un DeadLock lors de l'édition de l'enregistrement de deux tables (toujours les mêmes). Or ces enregistrements ne sont pas en cours de modification ailleurs.
J'ai cherché dans tous les sens, et je ne trouve rien d'anormal, surtout que pour les autres tables, celà fonctionne et que les propriétés de toutes les tables (TpFIBDataset) ont les mêmes valeurs.
Comme les instances des fenêtres et du DataModule sont crées dynamiquement, j'ai essayé de mettre leur propriété Name:='' (ce qui est conseillé) et aussi de leur donner un nom aléatoire, ca ne change rien.
J'ai aussi essayé de placer un TpFIBDatabase dans le datamodule pour faire une connexion à la DB différente pour chaque instance (en aillant déjà une connexion établie au lancement de l'application).
Mais apparament on ne peut pas avoir plusieurs connexion à une même DB dans une application car quand je veux préparer les requêtes pour les tables, je reçois l'exception suivante : ...EFIBClientError avec le message ':Transaction is active'.
Si j'essaye de fermer le programme, je reçois une exception lors de la déconnexion de la première connexion à la DB : EFIBInterbaseError avec le message 'DMMain.FDB: ...Cannot disconnect database with open transactions (1 active).', alors que cette transaction devrait passer par la connexion se trouvant dans le datamodule.
Si quelqu'un à une idée de la raison pour laquelle la partie en gras ne fonctionne pas, je suis preneur, surtout que ce fait 3 jours que je cherche et je n'ai plus d'idées.
Merci beaucoup.
Ah oui... Petit détail qui a peut-être son importance :
Pour chaque table, lors de la création d'un nouveau record j'ai le code :
Chaque table est en AutoCommit.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 With Datamodule.FIBDataset do begin Append; FIBDatasetID.AsString:=GetID; Post; (pour éviter possibilité doublons du ID) Edit; => 1ere instance OK, 2eme instance provoque exception DeadLock seulement pour 2 tables. end;
Partager