Précédent   Forum du club des développeurs et IT Pro > Bases de données > Autres SGBD > Paradox
Paradox Forum d'entraide sur Paradox, et sur Borland Database Engine
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 21/06/2011, 18h41   #1
sniperpro
Invité de passage
 
Mur Mikael
Inscription : avril 2010
Messages : 98
Détails du profil
Informations personnelles :
Nom : Mur Mikael

Informations forums :
Inscription : avril 2010
Messages : 98
Points : 0
Points : 0
Par défaut Un Problème réseau Qui me bloque :(

Bonjour à tous,

Si vous n'avez pas rencontrer ce genre de problème, merci de faire un petit test qui ne demande pas beaucoup du temps:

Pour cela il nous faut deux postes: un "client" et un "serveur" :

Environnement : Delphi / Paradox

1- Exécuter cette procédure delphi à partir du client : (Table1 est située dans le serveur)
Code :
1
2
3
4
5
6
7
procedure TForm1.OpenCloseClick(Sender: TObject);
begin
Table1.open ;
ShowMessage('o');
Table1.close ;
ShowMessage('c');
end;
2- Ouvrir la table (Table1) à partir du serveur.

3- A partir du poste client couper puis rétablir le réseau.

4- Re-exécuter la procédure TForm1.OpenCloseClick à partir du client.


==> L'interface client se plante

SVP J'aimerais bien avoir des solutions techniques, et non pas des conseilles genre il faut passer à un vrai SGBD client/serveur, ....
sniperpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/06/2011, 01h00   #2
Mat.M
Expert Confirmé Sénior
 
Développeur informatique
Inscription : novembre 2006
Messages : 4 440
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : novembre 2006
Messages : 4 440
Points : 5 858
Points : 5 858
Salut je risque de dire des aneries mais les bases de données Paradox ce sont des fichiers .db donc les exploiter en mode client-serveur ça me parait difficile.
1 sous Delphi les exceptions ça se gère me semble-t-il donc il faudrait mettre une gestion d'exception pour voir les erreurs et éviter le plantage.
2 si la BDD est mise sur un serveur il faut s'assurer des droits en admnistration côté serveur , lecture de fichier, écriture etc...

Ceci dit concernant Paradox je doute fortement qu'on puisse mettre les fichiers sur un serveur sans problèmes.

Citation:
Envoyé par sniperpro Voir le message
SVP J'aimerais bien avoir des solutions techniques, et non pas des conseilles genre il faut passer à un vrai SGBD client/serveur, ....
désolé mais tu te réponds à toi-même
avec Paradox ça me parait difficile ou alors chercher un composant tout fait pour Delphi une sorte d'unité payante...
Mat.M est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/06/2011, 01h06   #3
Mat.M
Expert Confirmé Sénior
 
Développeur informatique
Inscription : novembre 2006
Messages : 4 440
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : novembre 2006
Messages : 4 440
Points : 5 858
Points : 5 858
Citation:
Envoyé par sniperpro Voir le message
1- Exécuter cette procédure delphi à partir du client : (Table1 est située dans le serveur)

2- Ouvrir la table (Table1) à partir du serveur.

3- A partir du poste client couper puis rétablir le réseau.

4- Re-exécuter la procédure TForm1.OpenCloseClick à partir du client.


==> L'interface client se plante
Il ne faut pas du tout procéder comme cela.Lorsque tu cliques sur la TForm le code s'exécute normalement mais les échanges réseaux ne sont pas terminés.
Donc la solution c'est de placer la procédure d'ouverture dans un TThread et voir si la base de donnée est bien fermée.
Il faut s'assurer des codes de retour et mettre des gestions d'exceptions.
Mais faire ce genre de chose avec Paradox n'est pas exempts de problèmes...


Citation:
"Windows n'a pas pu sauvegarder toutes les données pour le fichier : \\nomServeur\....\....\PDOXUSERS.LCK. Les données ont été perdues"
je crois que c'est parfaitement clair : lorsqu'on veut ouvrir une table le BDE crée un fichier temporaire certainement un fichier tampon qui est censé être sur le poste client.
Donc le problème doit venir des droits sur le serveur d'écriture de fichiers ou bien alors le fichier .lck ne retrouve pas les références du ou des fichiers .bd correspondant(s) étant donné que les 2 fichier n'ont pas les mêmes emplacement physiques..
Mat.M est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/06/2011, 12h41   #4
sniperpro
Invité de passage
 
Mur Mikael
Inscription : avril 2010
Messages : 98
Détails du profil
Informations personnelles :
Nom : Mur Mikael

Informations forums :
Inscription : avril 2010
Messages : 98
Points : 0
Points : 0
Par défaut re

Merci bien Mat.M , pour votre réponse c'était très utile.


Et ben ce que j'ai constaté est que l'interface client se bloque pendant un moment (environ 4 ou 5 minutes), puis l'exécution se poursuit (les ShowMessage apparaissent ).

Donc ce que j'ai fait est de mettre la procédure OpenClose() dans un TThread, voici le comportement de l'interface lors de l'exécution de la procédure (4 éme étape du message précédent).

1- Les ShowMessage apparaissent normalement, pas de blocage de l'interface.

2- Mais lorsque je quitte l'interface, elle se plante pendant un moment (les 5min qui étaient dans la première procédure) puis elle se ferme.

Voici le code de la thread :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
unit UnitThreadTable;
 
interface
 
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, DB, DBTables;
 
type
  ThreadTable = class(TThread)
  private
    { Déclarations privées }
    Table1 : TTable ;
    procedure OnTerminateProcedure(Sender : TObject);
  protected
    procedure Execute; override;
  public
  //tester si le thread est terminé
  ThreadTerminated : BOOLEAN;
 
  constructor CREATE(ATable1 : TTable);
 
  end;
 
implementation
 
constructor ThreadTable.CREATE(ATable1 : TTable);
begin
 
FreeOnTerminate := True;
inherited CREATE(False);
Table1 :=ATable1;
OnTerminate := OnTerminateProcedure;
ThreadTerminated:=False ;
end;
 
 
procedure ThreadTable.Execute;
begin
  { Placez le code du thread ici }
  Table1.close();
  ShowMessage('c');
  Table1.open();
  ShowMessage('o');
 
end;
 
procedure ThreadTable.OnTerminateProcedure(Sender: TObject);
begin
ThreadTerminated:=True;
end;
 
end.
Le problème est que lors du blocage de l'interface la valeur de la variable ThreadTerminated est True .!!!!!!!
sniperpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 03h53.


 
 
 
 
Partenaires

Hébergement Web