ADO probleme réseau

cs_globule Messages postés 327 Date d'inscription mardi 8 octobre 2002 Statut Membre Dernière intervention 6 octobre 2010 - 21 mars 2005 à 10:34
cs_globule Messages postés 327 Date d'inscription mardi 8 octobre 2002 Statut Membre Dernière intervention 6 octobre 2010 - 22 mars 2005 à 07:33
Bonjour,

Je diffuse un application fait en VB qui utilise ADO 2.7
Le principe est simple. La base est stockée sur un poste, les autres postes utilisent une connexion réseau pour y acceder.
Chez certains clients en réseau (pas chez tous), mon application leur affiche le message d'erreur suivant (de temps en temps) quand elle essaye d'ecrire dans la BD

erreur d'execution
<?smaller> '-2147467259(80004005)'
impossible de mettre à jour actuellement vérrouillé

Mon code ressemble à ca. Je utilise des numéro auto pour les clés afin d'eviter tout probleme de redondance.

Set MyRecordSet = New ADODB.Recordset
MyRecordSet.open "MaTable", AdoMaBase, adOpenKeyset, adLockOptimistic

MyRecordSet.AddNew
MyRecordSet.fields("MonChamp").value = "toto"
' Fermeture du recorset
MyRecordSet.update


If (Not MyRecordSet Is Nothing) Then
If MyRecordSet.State = adStateOpen Then MyRecordSet.Close
Set MyRecordSet = Nothing
End If

5 réponses

gaa179 Messages postés 361 Date d'inscription mercredi 21 mai 2003 Statut Membre Dernière intervention 12 novembre 2009 2
21 mars 2005 à 11:09
Salut,

Il ne s'agit pas d'un problème réseau, mais d'un problème de partage de données entre différents utilisateurs.
Quand tu ouvres un recordset en mode édition avec le paramètre adLockOptimistic, tu bloques la page d'enregistrements contenant ton enregistrement. Donc dans ton cas, quand tu fais un AddNew, tu dois bloqué les AddNew des autres utilisateurs. Tu peux résoudre ton problème en utilisant le code suivant:

Dim StrSql 'chaine contenant la requête SQL.
StrSql = "INSERT INTO [Ma Table] (MonChamp) VALUES ('Toto')"
AdoMaBase.execute StrSql

Voilà cela devrait résoudre ton problème.

Remarque:
- N'utilise jamais d'espace dans le nom des champs, de tables, ... Il n'y a que Access qui accepte cette écriture (compatibilité pour d'éventuelle migration).
- Si tu veux utiliser ta méthode, tu devras gérer les messages d'erreurs générée par ta connection.
- Pour ce qui est le partage de base de données, Access n' a pas la meilleur gestion de ce genre d'utilisation. MySql, SQL Server, Oracle entre autres, sont prévus pour fonction en mode partagé.

A+
0
cs_globule Messages postés 327 Date d'inscription mardi 8 octobre 2002 Statut Membre Dernière intervention 6 octobre 2010
21 mars 2005 à 11:25
Si j'ai bien compris vous me conseillez d'utiliser des requêtes SQL à la place des Addnews ?
Ca représente une énorme modification de mon programme. Etes vous certain que c'est efficace ?
De plus je modifie ou rajoute souvent plusieurs champs en même temps. Il faut que je fasse la même chose pour les modifications ?<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />ADO n'est il pas capable de gérer correctement les Addnews ? Surtout que ce probleme ne se produit pas chez tous mes clients.
0
cs_globule Messages postés 327 Date d'inscription mardi 8 octobre 2002 Statut Membre Dernière intervention 6 octobre 2010
21 mars 2005 à 13:42
J'ai testé avec

Dim StrSql 'chaine contenant la requête SQL.
StrSql = "INSERT INTO [Ma Table] (MonChamp) VALUES ('Toto')"
AdoMaBase.execute StrSql

C'est pire.
Ca supporte encore moins bien le réseau que ma méthode.

J'ai fait un test simple Ajouter 25000 enregistrement dans une base en réseau simultanément sur 2 postes et au bou de quelques secondes j'obtiens : Impossible de mettre à jour, Actuellement verrouillée.
C'est inquiétant ADO + Access sont incapable de travailler en réseau proprement ....Quelqu'un à t'il une solution, car je ne sait plus quoi faire ... <?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />
0
gaa179 Messages postés 361 Date d'inscription mercredi 21 mai 2003 Statut Membre Dernière intervention 12 novembre 2009 2
21 mars 2005 à 15:02
Si un utilisateurs ajoutes 25000 records en une fois, dis moi comment il procède.
L'utilisateur n'encode qu'une valeur à la fois. Si de cette opération découle la creation d'autant de records, change de système de base de données. Passe à SQL Server par exemple. Tu pourras utiliser des triggers pour créer le reste sur le serveur.

A+
0

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

Posez votre question
cs_globule Messages postés 327 Date d'inscription mardi 8 octobre 2002 Statut Membre Dernière intervention 6 octobre 2010
22 mars 2005 à 07:33
C'est un exemple pour tester la solidité de la procedure. SQL serveur est bien trop cher et difficile à mettre en place. Mais clients rencontrent ce probleme si ils executent une requetes simultanement. Mon programme sert donc à reproduire ce probleme pour trouver la solution

Je suppose qu'ADO et access doivent quand même etre capable de gérer un reseau efficassement, je cherche juste une solution.
0
Rejoignez-nous