Accèes multiutilisateurs sous ADO

Lemside Messages postés 6 Date d'inscription jeudi 1 avril 2004 Statut Membre Dernière intervention 24 juin 2010 - 12 août 2005 à 11:33
Tuning Max Messages postés 314 Date d'inscription mercredi 15 juin 2005 Statut Membre Dernière intervention 31 août 2006 - 22 août 2005 à 10:55
j'ai développé une petite Appli de gestion à l'aide de Vb6,ADO et ACCESS et voilà qu'on me demande de la faire tourner sous réseau 10 postes. je serai ravi si quelqu'un peut m'aider pour l'accèes multiutilisateurs sous ADO.

8 réponses

Tuning Max Messages postés 314 Date d'inscription mercredi 15 juin 2005 Statut Membre Dernière intervention 31 août 2006 1
12 août 2005 à 16:08
Moi je te conseillerais d'utiliser la sécurisation de ta base par Workgroups, qui te permet de gérer les différents accès possible (lecture, écriture, modification, ajout,...) à tes tables. Ensuite il te faudra inclure dans ton application VB6 la gestion du Workgroups (utilisateur, groupe sécurité) et modifier un peu ton code de connexion pour inclure ce Workgroups, le nom de l'utilisateur et le mot de passe.
Sinon il existe plein d'autres moyens tels que créer un fichier (à crypter bien évidement) ou une autre base Access qui gère tes accès mais en générale c'est plus long et moins sécurisé.
En tout cas c'est ce que j'ai déjà mis en place pour un société est celà fonctionne toujours
0
Lemside Messages postés 6 Date d'inscription jeudi 1 avril 2004 Statut Membre Dernière intervention 24 juin 2010
13 août 2005 à 15:57
Merci mais Que voulez vous dire par "utiliser la sécurisation de ta base par Workgroups" ??. ça ve dire créér +ieurs utilisateurs Chacun avec un nom et un mot de passe et puis proceder à leur identification au moment du lancement de l' appli?
0
Tuning Max Messages postés 314 Date d'inscription mercredi 15 juin 2005 Statut Membre Dernière intervention 31 août 2006 1
16 août 2005 à 10:59
Comment expliquer ça! Il existe pour Access, une sécurité relativement facile à mettre en place, il s'agit de la sécurité au niveau utilisateur.
Lorsque la sécurité au niveau utilisateur est utilisée dans une base de données Access, un administrateur de base de données ou le propriétaire d'un objet peut octroyer à des utilisateurs individuels ou à des groupes des autorisations d'accès spécifiques à des tables, à des requêtes, à des formulaires, à des états et à des macros. Cette sécurité de Microsoft Access est très similaire aux mécanismes de sécurité existant sur des systèmes serveur. À l'aide de mots de passe et d'autorisations, vous pouvez permettre ou limiter l'accès à des objets de votre base de données par des personnes ou groupes de personnes. Les comptes de sécurité définissent les utilisateurs et les groupes d'utilisateurs autorisés à accéder aux objets de votre base de données. Ces informations, qui sont connues sous le nom de groupe de travail, sont stockées dans un fichier de groupe de travail (.mdw). Le groupe de travail est un groupe d'utilisateurs d'un environnement multi-utilisateurs qui partagent des données et le même fichier de groupe de travail. Ce fichier de groupe de travail est lu par Access au démarrage et contient les informations relatives aux utilisateurs d'un groupe de travail. Ces informations comprennent notamment les noms de compte des utilisateurs, leur mot de passe et les groupes auxquels ils appartiennent.
Dans le principe, tu commence par protéger ta base de données Access avec le système que je t'ai décrit ci-dessus. Ensuite, car à partir du moment où ta base devient sécurisé, tu modifie ton application développé en VB6 afin d'inclure lors de l'ouverture de celle ci la saisie et le stockage provisoire d'un "login" et d'un "password" pour les connexions à ta base de donnée. Enfin toujours dans ton application tu modifie ta ou tes connexions à cette base de façon à inclure le fichier de groupe de travail, le password et le login saisie par ton utilisateur lors de l'ouverture de ton application.

Pour sécuriser la base, le plus rapide est de passer par l'Assistant Sécurité au niveau utilisateur qui permet d'appliquer une sécurité au niveau utilisateur avec un modèle de sécurité global et de coder la base de données Microsoft Access.

Ouvrez la base de données que vous voulez protéger.
Dans le menu Outils, cliquez sur Sécurité, puis cliquez sur Assistant Sécurité au niveau utilisateur.
Suivez les instructions données dans les boîtes de dialogue de l'Assistant.


Voilà, j'espère avoir été suffisamment claire et que cela correspond à ce que tu cherche. N'hésite pas à me poser d'autres questions si besoin
0
Tuning Max Messages postés 314 Date d'inscription mercredi 15 juin 2005 Statut Membre Dernière intervention 31 août 2006 1
16 août 2005 à 12:28
Ha oui! Tu ne me l'as pas demandé et tu connais déjà peut être, mais à tout hasard, je te donne aussi deux méthodes de connexion à ta base en ADO. L'une utilise un DNS l'autre établis une connexion directe. Pour ma part je préfère le DNS que tu définis dans le panneau de configuration de Windows et qui te permet de modifier le chemin d'accès à ta base ou le nom du fichier système (MDW) de ta connexion.

******************************** Start Code ***********************************
' ************************************************************************************************************** '
' '
' Module contenant deux fonctions de connections ADO à une base donnée Access sécurisé par groupe de travail '
' (mdw) '
' La première méthode utilise un DNS pré-définis sur le poste de travail et dans lequel ont aura pris soin de '
' définir le fichier mdw du groupe de travail sur lequel ont travail pour ouvrire la base de donnée '
' '
' La seconde est une connection directe sans DNS '
' '
' '
' ************************************************************************************************************** '
Public Function ConnDNS(NomDuDNS As String, UserName As String, Password As String) As Boolean
On Error GoTo Err_ConnStrait
Dim Cnx As New ADODB.Connection
Dim strConn As String

ConnectionDNS = False
' Nom que vous avez donné à votre DNS lorsque vous l'avez créé
NomDuDNS = "XXXXXX" ' dans l Administrateur de Sources de données (ODBC)
' du Panneau de configuration de Microsoft Windows

' initialise la chaine de connexion
strConn = "DNS=" & NomDuDNS & ";"

' vérifie que la connexion est bien fermée
If Cnx.State = adStateOpen Then
Cnx.Close
End If

' Connexion à la base de donnée
Cnx.Open ConnectionString:=strConn, UserID:=UserName, Password:=Password

' Attente jusqu'à la connexion effective
While (Cnx.State = adStateConnecting)
DoEvents
Wend

' Vérification des erreurs eventuelles ou attribution de la valeur "True" à la connexion
If Cnx.Errors.Count > 0 Then
MsgBox Cnx.Errors.Item(0)
ConnStrait = False
Exit Function
Else:
ConnStrait = True
End If
Exit Function
Err_ConnStrait:
MsgBox err.Description
ConnStrait = False
Exit Function
End Function
********************************* End Code ***********************************

******************************** Start Code ***********************************
Public Function ConnStrait(UserName As String, Password As String) As Boolean
On Error GoTo Err_ConnStrait
Dim Cnx As New ADODB.Connection
Dim strConn As String

ConnStrait = False

' Initialise la chaine de connexion
strConn = "Data Source=C:\...\NomDuFichier.MDB;" & _
"Jet OLEDB:System database=C:\...\NomDuFichier.MDW"
Cnx.Provider = "Microsoft.Jet.OLEDB.4.0"

' vérifie que la connexion est bien fermée
If Cnx.State = adStateOpen Then
Cnx.Close
End If

' Connexion à la base de donnée
Cnx.Open ConnectionString:=strConn, UserID:=UserName, Password:=Password

' Attente jusqu'à la connexion effective
While (Cnx.State = adStateConnecting)
DoEvents
Wend

' Vérification des erreurs eventuelles ou attribution de la valeur "True" à la connexion
If Cnx.Errors.Count > 0 Then
MsgBox Cnx.Errors.Item(0)
ConnStrait = False
Exit Function
Else:
ConnStrait = True
End If
Exit Function

Err_ConnStrait:
MsgBox err.Description
ConnStrait = False
Exit Function
End Function
0

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

Posez votre question
Lemside Messages postés 6 Date d'inscription jeudi 1 avril 2004 Statut Membre Dernière intervention 24 juin 2010
17 août 2005 à 13:46
Merci beaucoup, je pense que ça doit aller. vous aurez ma réponse définitive dès que j'aurais fini de tester ce que vous m'avez envoyé. Merci encore.
0
Tuning Max Messages postés 314 Date d'inscription mercredi 15 juin 2005 Statut Membre Dernière intervention 31 août 2006 1
17 août 2005 à 16:23
De rien, j'ai moi même pas mal utilisé ce site pour demander de l'aide, et c'est à mon avis l'un des meilleurs dans le domaine. Jusqu'a présent j'ai énormément appris grâce à ce site. Il est normal que je retourne l'ascenseur
0
Lemside Messages postés 6 Date d'inscription jeudi 1 avril 2004 Statut Membre Dernière intervention 24 juin 2010
18 août 2005 à 20:54
Bonjour Tuning Max et Voilà pour le résultat du test:
J'ai utilisé votre fonction 'ConnSTrait' pour étabilir la connection sur ma base ACCESS. Bien sûr après avoir créer deux utilisateurs chacun avec un nom et un mot de passe à l'aide de l'assistant ACCESS et j'ai donné à chacun des ces utilisateurs les droits Administrateur sur tous les objet de la base:(pour le moment la base contient une seule table :'Patients')

Quand je lance ma Forme VB, j'ouvre la table Patients comme suit:

***********************Debut Code********************************
SQL = "Select * From Patients Order By NumDossier;"
Public Function OuvreTable(SQL As String, Rs As ADODB.Recordset) As Boolean
Dim CMD As New ADODB.Command

On Error GoTo Terror
Set CMD.ActiveConnection = Cnx
Set Rs = New ADODB.Recordset
CMD.CommandText = SQL

Rs.CursorLocation = adUseClient
Rs.Open CMD, , adOpenStatic, adLockBatchOptimistic

Set CMD = Nothing
OuvreTable = True
Exit Function
Terror:
MsgBox CStr(Err.Number) & " : " & Err.Description
OuvreTable = False
End Function
********************* Fin code**********************
Une fois ouverte, je procède à des ajouts: rs.addNew
Mais en ouvrant deux instances de ma forme pour modifier ou ajouter un enregistrement de cette table(simulation pour l'accès concurrentiel),
voilà le message qui s'affiche au moment du updateBatch de la deuxième instance de ma Forme VB: <<<-2147217864 : Row cannot be located for updating. Some values may have been Changed since it was last read.>>> Alors que faire pour que les MAJ se fassent pour les deux utilisateurs. Merci beaucoup pour votre aide.
0
Tuning Max Messages postés 314 Date d'inscription mercredi 15 juin 2005 Statut Membre Dernière intervention 31 août 2006 1
22 août 2005 à 10:55
Oui et c'est tout à fait normale. C'est dû à l'absence d'un DataControl ; lorsque tu passe par l'intermédiaire d'un DataControl, c'est ce dernier qui gère la connexion, le recordset et surtout le curseur.
Le problème que tu rencontre vient du fait que dans ta connexion SQL, tu as utilisé un curseur coté client et un verrou "static". Ce type de verrou est généralement utilisé pour rechercher des données ou générer des rapports
Petit rappel :
"Un curseur est un mécanisme qui retourne les enregistrements et définit comment l'ADO peut accéder à et utiliser ces enregistrements. Les curseurs commandent la navigation à travers les enregistrements, la possibilité de mise à jour des données, et la visibilité de modifications de la base de données effectuées par d'autres utilisateurs" (dixit MSDN)

Pour ma part j'utiliserais plutôt cette méthode :

Public Function OuvreTable(SQL As String, Rs As ADODB.Recordset) As Boolean
Dim CMD As New ADODB.Command
On Error GoTo Terror
Set CMD.ActiveConnection = Cnx
Set Rs = New ADODB.Recordset

SQL = "Select * From Patients Order By NumDossier;"
CMD.CommandText = SQL

With Rs
' Travaille du côté serveur
.CursorLocation = adUseServer
' Pose un verrou
.CursorType = adOpenKeyset
' les changements sont immédiats sur la base de donnée
.LockType = adLockPessimistic
.Open CMD, , , , adCmdTable
End With

Set CMD = Nothing
OuvreTable = True
Exit Function
Terror:
MsgBox CStr(err.Number) & " : " & err.Description
OuvreTable = False
End Function

PS : Attention à bien fermer le recordset après l'update ; sans quoi tu garde le verrou actif empêchant toute modification pour un autre utilisateur ou par un autre recordset
0
Rejoignez-nous