PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → HRestaureSauvegarde - Erreur 75020
HRestaureSauvegarde - Erreur 75020
Débuté par dev_compil, 31 mai 2016 16:55 - 6 réponses
Membre enregistré
28 messages
Popularité : +2 (2 votes)
Posté le 31 mai 2016 - 16:55
Bonjour,

Après avoir effectué une sauvegarde je tente de la restaurer par l'intruction HRestaureSauvegarde. La restauration ne peut se faire car la base serait en cours d'utilisation !

Erreur renvoyée par le serveur <127.0.0.1:5019> :
Vous ne pouvez pas procéder à la restauration de la base de données <maBase> car la connexion <MaConnexion1> ouverte depuis la machine <monposte> pour l'utilisateur <admin> utilise cette base de données.

Code erreur : 75020
Niveau : erreur non fatale (EL_ONRETURN)
Code erreur WD55 : 5020

D'après l'exemple de PCsoft http://doc.pcsoft.fr/fr-FR/?1000020402&name=hrestauresauvegarde_fonction
l'ajout de HFermeConnexion ne change rien.

SI HFermeConnexion(MaConnexion1) = Faux ALORS
Erreur("Erreur lors de la fermeture de la connection", HErreurInfo())
RETOUR
SINON
Multitâche(100)
FIN

Le Centre de Contrôle ne liste qu'une connexion en cours (lui-même). La restauration via le Centre de Contrôle ne pose aucun problème. Le reboot du poste n'y fait rien (serveur HFSQL en local sur le poste de dev).
Le même problème se pose avec WinDev 19 et WinDev 21.

Merci pour votre aide.
Posté le 31 mai 2016 - 20:22
Il faut que l'application n'ouvre qu'une seule connexion vers le serveur. Cette connexion doit être sur le serveur et pas sur la base c'est a dire que le membre MaConnexion..BaseDeDonnée=""
Membre enregistré
28 messages
Popularité : +2 (2 votes)
Posté le 01 juin 2016 - 09:24
Merci ckelvin pour le bon tuyau.
Membre enregistré
68 messages
Popularité : +4 (4 votes)
Posté le 01 juin 2016 - 16:07
Hello,

Je rebondis sur le sujet car je suis sur la même problématique ...
Je cherche à pouvoir restaurer via le code donc j'ai bien compris qu'il faut n'avoir qu'une seule connexion d'active sans préciser la BDD. Soit.

Maintenant, mon code utilise les threads automatiques ainsi que les copies du contexte HFSQL et donc, les copies de la connexion. Mon problème est le suivant : comment fermer cette connexion par programmation ?

J'ai essayé de creuser un peu dans les fonctions threads, les hfermeconnexion et direct sur google mais je trouve rien ... Quelqu'un a une piste pour éclairer ma lanterne ?

L'alternative sera un soft tiers avec une gestion de socket et là, ça m'enchante moyen ..

Merci de m'avoir lu =}
Membre enregistré
28 messages
Popularité : +2 (2 votes)
Posté le 01 juin 2016 - 17:36
Hi,

Il te sera impossible de restaurer une sauvegarde avec des connexions multiples sur la même base (celles des threads en cours).

Evite donc l'emploi de threads lorsque l'on doit faire une restauration. Ainsi :
- soit tu kill tous tes threads (la restauration se fera donc depuis le thread principal)
- soit tu demandes au serveur de déconnecter tous les clients connectés par un code du genre :

// Déconnection des clients connectés à la base
SI EnModeTest() ALORS Trace(HListeUtilisateurConnecté(MaConnexion1))
HRAZClient()
HClient.Base = MaConnexion1..BaseDeDonnées
HDéconnecteClient(MaConnexion1,"",0)


Le risque étant une reprise automatique des connections par certaines applications clientes.


Ensuite tu peux entamer une restauration

// Se déconnecter
SI HFermeConnexion(MaConnexion1) = Faux ALORS
Erreur("Erreur lors de la fermeture de la connection", HErreurInfo())
RETOUR
SINON
Multitâche(100)
FIN


// Connection au serveur mais sans spécifier de base !!!!!
sMaBase = MaConnexion1..BaseDeDonnées
MaConnexion1..Utilisateur = "admin"
MaConnexion1..MotDePasse = "<mot de passe>"
MaConnexion1..BaseDeDonnées = ""
SI PAS HOuvreConnexion(MaConnexion1) ALORS
Erreur("Erreur de connection au serveur", HErreurInfo(hErrComplet))
RETOUR
FIN


// Restauration de la base à partir de la sauvegarde sélectionnée (Fichiers + contraintes + procédures stockées)
nID = COMBO_svg..ValeurMémorisée

SI PAS HRestaureSauvegarde(MaConnexion1, nID) ALORS

Erreur("Erreur lors de la restauration de la base", HErreurInfo(hErrComplet))
VersPressePapier(HErreurInfo(hErrComplet))
RETOUR

FIN
Membre enregistré
28 messages
Popularité : +2 (2 votes)
Posté le 01 juin 2016 - 17:59
Il est possible de demander au serveur d'interdire toute nouvelles connection sur une base par l'intruction

HInterditAccèsBaseDeDonnées(MaConnexion1,"maBase")

// Restautation de la base en cours ...

HFinInterditAccèsBaseDeDonnées(MaConnexion1,"maBase")
Membre enregistré
68 messages
Popularité : +4 (4 votes)
Posté le 02 juin 2016 - 14:53
Re,

Merci d'avoir pris le temps de détailler aussi bien, c'est super clair !

Tel quel dans mon projet, ça ne fonctionne pas (thread automatique appelé toutes les secondes qui me laisse une connexion ouverte) mais je vais développer un soft tiers qui va faire le boulot en utilisant ce que tu as fait.

Merci à toi