Connexion fermée à quel moment?

Résolu
js8bleu Messages postés 576 Date d'inscription samedi 14 octobre 2006 Statut Membre Dernière intervention 27 janvier 2014 - 30 juil. 2009 à 01:25
js8bleu Messages postés 576 Date d'inscription samedi 14 octobre 2006 Statut Membre Dernière intervention 27 janvier 2014 - 1 août 2009 à 09:47
Bonjour à tous,

j'aimerai savoir s'il est meilleur pour une application en réseau (donc avec plusieurs utilisateurs, VB 6.0/Access) d'ouvrir une connexion à une BD une bonne fois pour toute (dans un module) et qu'on fermera lorsqu'on quitte l'application ou bien de l'ouvrir dans chaque formulaire et la refermer lorsqu'on quitte le formulaire. Merci d'avance de votre aide. Je n'arrive pas à me décider.

Cordialement.

12 réponses

PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
31 juil. 2009 à 14:54
je crée une instance différente par formulaire et pour chaque utilisateur (si oui c'est quoi une instance s'il te plaît?)


chaque utilisateur lance ton programme
c'est bien une instance du programme puisque chacun a son exe et son pc...
par contre comme tu as CNX en public, chaque "utilisateur" (donc chaque exe) partage son unique connexion entre chacun de SES formulaires

raisons évoquées au dessus, tu ne dois pas.
il faut avoir plusieurs INSTANCES, c'est à dire un classe, qui sera déclarée et initialisée sur chaque formulaire

à toi ensuite d'optimiser la classe

pour les RS, aussi dans la classe
tu peux ensuite te faire des méthodes pratiques retournant directement un résultat de requête ou le RS lui-même
là encore çà dépend de ton code et de l'usage de l'appli


pour les options multi à utiliser, je ne sais plus s'il faut aussi les définir sur la base ou que sur les RS...
j'ai toujours laissé l'accès base par défaut, et les RS ainsi :

adOpenDynamic, adLockOptimistic
3
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
31 juil. 2009 à 21:17
[quote=js8bleu]30 instances = 30 connexions de noms différents à la BD/quote

ou plus (connexions) : autant de connexions que de requêtes
pas de nom différent pour autant !!!

il doit y avoir un souci de conception/visualisation

regardons différemment :

tu poses une textbox sur un formulaire
tu as bien une zone de saisie (fond blanc, écriture noir, caret (curseur), et tu peux y entrer des chaines

tu en poses une seconde
même chose....

tu change la couleur de l'écriture (forecolor) de la zone1 => la zone2 n'est pas affectée

pourtant le code depuis le control TEXTBOX est bien le même...
il n'y a pas 50 codes différents en supposant qu'on va en poser 2, 4, ou 50

chaque textbox posée sur ta form est bien une instance de la classe (ou control) textbox

ici c'est pareil, tu vas créer une classe unique, qui sera instanciée. le nom n'y change rien, ni le nombre de form, ni le nombre de lancement de ton application sur 1 ou plusieurs ordinateurs

c'est plus clair?
3
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
30 juil. 2009 à 02:36
salut,
çà dépend de ton nombre d'utilisateurs simultanés, des accès (verrouillé pendant connexion), etc

si tu as pas mal de connexion pour peu de requêtes (du moins pas à la chaîne), tu peux même ouvrir et fermer la connexion à chaque requête. si tes objets sont correctement gérés çà ne se sentira même pas en temps d'execution sur un lan classique

++
[hr]
0
js8bleu Messages postés 576 Date d'inscription samedi 14 octobre 2006 Statut Membre Dernière intervention 27 janvier 2014 2
30 juil. 2009 à 02:58
Bonjour et Merci PCPT pour ton intervention. Disons que c'est pour une quinzaine d'utilisateurs. Ce que je fais :

- J'ai créé un module où se trouve les code de connexion suivant :

Public cn As New ADODB.Connection
Public rs As New ADODB.Recordset
Public rsClt As New ADODB.Recordset

*****************************************************************
Public Sub connect()
Set cn = New ADODB.Connection
cn.Provider = "microsoft.jet.oledb.4.0"
cn.ConnectionString = "\\ServeurBD\BDs\BDPharma.mdb"
cn.Open
End Sub

*****************************************************************
Public Sub disconnect()
cn.Close
End Sub


- Dans le Load d'un formulaire qui interagit avec la BD j'appelle la connexion (que je referme au Unload du formulaire) puis je déclare un recordset que je referme après utilisation.

connect

*****************************************************************
Dim rs1 As New Recordset
rs1.Open "select * from Tableproduit where desproduit like '" & txtproduit & "%' order by(desproduit) ", cn

*****************************************************************
rs1.Close

*****************************************************************

- Dans le Unload du formulaire je saisi

disconnect


Quand donc dois-je fermer la connexion ouverte s'il vous plaît (car j'ai peur de fermer la connexion à la fermeture du formulaire alors que d'autres utilisateurs sont connectés sur ce même formulaire) ? Merci d'avance.

NB : Tous vos très précieux conseils seront les bienvenus.

Cordialement.
0

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

Posez votre question
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
30 juil. 2009 à 03:35
... sur leur formulaire mais sur leur poste, donc une instance différente de l'application

sous le CN.CLOSE tu peux ajouter set cn = nothing
tu peux aussi le passer en private apparemment


pourquoi dans ton module tu as un rs et un rsClt alors que tu ne les utilises pas?

et si tu n'as que des SELECT (pas d'écriture), tu peux passer le tout en module de classe et n'utiliser qu'une seule méthode, disons ExecuteSQL, qui elle va faire le connect, la requête en paramètre, le disconnect, et te renvoyer un objet RS

++
0
js8bleu Messages postés 576 Date d'inscription samedi 14 octobre 2006 Statut Membre Dernière intervention 27 janvier 2014 2
30 juil. 2009 à 09:10
OK Merci pour tes très précieux conseils. Seulement je n'ai pas trop compris
... sur leur formulaire mais sur leur poste, donc une instance différente de l'application
. Pour le reste il n'y a pas de problème j'ai bien compris et je le ferais. Merci de bien vouloir m'expliquer (si possible car je sais que vous êtes très occupé) votre première phrase. Merci d'avance.

NB : Pour ce qui est de rsClt, je ne vous ai envoyé qu'une partie du code sinon il s'agit d'un recorset que j'utilise en plus de rs. J'ai d'insertion (insert into) que de select.

Cordialement.
0
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
30 juil. 2009 à 09:44
Salut,

... sur leur formulaire mais sur leur poste, donc une instance différente de l'application


en réponse à :

(car j'ai peur de fermer la connexion à la fermeture du formulaire alors que d'autres utilisateurs sont connectés sur ce même formulaire)


@+

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
0
js8bleu Messages postés 576 Date d'inscription samedi 14 octobre 2006 Statut Membre Dernière intervention 27 janvier 2014 2
31 juil. 2009 à 13:02
Bonjour et Merci Mayzz pour ton intervention. Est-ce à dire que :

COMME J'OUVRE UNE CONNEXION LORSQUE J'OUVRE UN FORMULAIRE ET QUE JE LA REFERME LORSQUE JE QUITTE LE FORMULAIRE, SI PAR EXEMPLE TROIS(3) UTILISATEURS TRAVAILLENT EN MÊME TEMPS SUR UN MÊME FORMULAIRE ET QU'UN DES TROIS QUITTE (DONC PAR CONSÉQUENT FERME LA CONNEXION PUISQU'IL A QUITTE LE FORMULAIRE) ALORS QUE LES DEUX AUTRES SONT ENCORE ENTRAIN DE TRAVAILLER SUR LE MÊME FORMULAIRE (DONC SENSÉ ÊTRE CONNECTÉ) EST-CE QU'IL RISQUE D'Y AVOIR UN PROBLÈME OU NON?

EST-CE QUE L'UTILISATEUR QUI A QUITTÉ A SEULEMENT FERMÉ SA CONNEXION ET NON CELLE DES AUTRES? VRAIMENT MERCI DE BIEN VOULOIR ÉCLAIRER MA LANTERNE./b

MERCI D'AVANCE.

CORDIALEMENT.
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
31 juil. 2009 à 13:30
[quote=PCPT]çà dépend (...) des accès (verrouillé pendant connexion)/quote

si tu es en accès exclusif, une erreur sera relevée lors de la tentative d'accès d'un utilisateur, ce depuis n'importe quel formulaire, tant qu'il y a un accès à la base, de n'importe qui

sinon (mode multi), chacun ferme en effet uniquement sa connexion
cependant il peut y avoir un problème avec ton fonctionnement

tu ouvres la connexion au chargement d'un formulaire, et la ferme lors de la destruction du formulaire, c'est bien çà?
avec un connexion qui est public, une seule pour tous les formulaires

ok...
formulaire1, click pour ouvrir le formulaire2 et quitter le 1 =>

form2.show
unload me


form2 va ouvrir la connexion qui est déjà ouverte
=>pas forcément de bug mais çà ne sert à rien
et le unload de form1 va fermer la connexion utile pour form2
=> bug à la prochaine requête


on en revient à ce que je t'ai proposé précédemment
voir cet exemple pour avoir une idée

++
0
js8bleu Messages postés 576 Date d'inscription samedi 14 octobre 2006 Statut Membre Dernière intervention 27 janvier 2014 2
31 juil. 2009 à 14:24
Bonjour et Merci PCPT pour ton aide. C'est justement ce que tu m'as proposé que je n'ai pas compris. J'aimerai bien adopter ta méthode mais je t'assure que je n'ai pas compris ce que tu me conseilles. Ce que je crois avoir compris c'est que tu aimerais que je crée une instance différente par formulaire et pour chaque utilisateur (si oui c'est quoi une instance s'il te plaît?), pas de problème pour la fermeture de la connexion (set cn = nothing). Pour les SELECT tu me conseilles de les déclarer dans une seule méthode (dans un module) et que j'appellerai chaque fois en cas de besoin au lieu de déclarer les mêmes recordset dans chaque formulaire à chaque fois. Quelle option faut-il utiliser pour le mode multi utilisateur s'il te plaît? Merci d'avance.

Cordialement.
0
js8bleu Messages postés 576 Date d'inscription samedi 14 octobre 2006 Statut Membre Dernière intervention 27 janvier 2014 2
31 juil. 2009 à 17:48
Merci PCPT, je pense avoir enfin compris. Récapitulatif tu me conseilles de :

- Créer une instance pour chaque formulaire (donc 30 formulaires 30 instances 30 connexions de noms différents à la BD) ;

Mais est-ce que tu pense que cette solution permettra de gérer 10 utilisateurs d'être sur le même formulaire en même temps donc d'utiliser la même connexion ou bien cela ne causera pas de problème?

NB : Concernant les RecordSet j'utilisais adOpenStatic, adLockOptimistic mais maintenant j'irai avec adOpenDynamic, adLockOptimistic. Merci beaucoup.

Merci d'avance.

Cordialement.
0
js8bleu Messages postés 576 Date d'inscription samedi 14 octobre 2006 Statut Membre Dernière intervention 27 janvier 2014 2
1 août 2009 à 09:47
Oui c'est clair. Merci beaucoup PCPT. Je vais donc suivre tes conseils faire les tests et espérer que je serais à la hauteur. C'est vraiment très gentil de ta part. Merci pour ton altruisme. Excellente journée et prends bien soin de toi.

Cordialement.
0
Rejoignez-nous