Bonjour à tous,
Il y a 6 mois j'ai migré une base de donnée Access 97 vers Access 2010.
Le plus dur à été de passer de DAO à ADO, mais j'y suis arrivé.
Ma base de données Access 2010 sert d'application frontale (installée sur des PC avec Win XP), le moteur de base de données étant celui de Sql Anywhere 6 de Sybase installé sur un serveur Windows 2003.
L'application frontale Access 2010 est en production depuis 2 mois et tout fonctionne bien dans un environnement multi utilisateur.
Seulement je n'étais pas encore tombé sur un test de verrouillage aprés un rs.MoveNext et la j'ai un gros soucis pour tester si l'enregistrement est verrouillé ou pas
Voici mon code :
Avant de lancer ma procédure, je vais sur un autre poste modifier un enregistrement de la table devise et donc le verrouille pour le test.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 Dim enr As ADODB.Recordset Dim rtn As Long Dim requete As String requete = "select * from dba.devise order by dv_code" ' ouverture du recordset en mode IO pour modification de tous les enregistrements rtn = enreg_open(enr, requete) Do Debug.Print enr!dv_code rtn = enreg_next(enr) Loop Until enr.eof rtn = enreg_close(enr) Function enreg_open(enr As ADODB.Recordset, requete As String) As Long Dim statelock As Long enreg_open = False ' Lecture avec test de verrouillage enr.CursorLocation = adUseServer enr.Open requete, vg_connexion, adOpenDynamic, adLockPessimistic, adCmdText ' test verrouillage statelock = enr.EditMode Exit Function err_open: ' enregistrement non verrouillé If err.Number = 3021 Then Resume Next ' enregistrement verrouillé par Sybase if err.number= -2147467259 then ' on ferme et on réouvre pour retester le verrouillage enr.Close enr.Open requete, vg_connexion, adOpenDynamic, adLockPessimistic, adCmdText ' le resume ramène sur la ligne statelock = enr.EditMode Resume end if End Function Function enreg_next(enr As ADODB.Recordset) As Boolean enreg_next = False On Error GoTo err_next ' lecture enregistrement suivant enr.MoveNext Exit Function ' gestion des erreurs err_next: if err.number=-2147467259 then ' boucle jusqu'a ce que l'enregistrement verrouillé soit libéré Resume end if End Function
La boucle enr.MoveNext fonctionne jusqu'a cet enregistrement la.
L'erreur est déclanchée sur la ligne enr.MoveNext (qui est verrouillée par ailleurs) et la main est passée à la gestion d'erreur err_next
Le resume ramène sur enr.MoveNext, mais il n'y a plus de code erreur et le MoveNext m'a fait passer à l'enregistrement suivant au lieu de rester bloqué sur l'enregistrement verrouillé !
Tout ceci fonctionnait très bien avec DAO, mais ne fonctionne plus maintenant.
L'autre différence entre DAO et ADO lors de l ouverture d'un recordset est :
Avec DAO l'erreur était déclanchée par : enr.Open requete, vg_connexion, adOpenDynamic, adLockPessimistic, adCmdText
Alors qu'avec ADO elle l'est avec : statelock = enr.EditMode
J'ai pu adapter cette fonction et la faire fonctionner, mais je coince sur MoveNext, car je ne sais pas si le problème vient de ADO ou de Sybase...
Merci d'avance de votre aide, ça fait une semaine que je suis dessus et je sèche
Partager