Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3144 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  problème avec la mise à jour de données en VB avec ADO

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

problème avec la mise à jour de données en VB avec ADO

n°377613
gar6more74
Posté le 30-04-2003 à 10:10:22  profilanswer
 

Bonjour,
 
Je développe une application de gestion vers une base de donnée Access. Je suis entrain de migrer cette application pour l?utiliser avec MySQL. Je dois modifier mes sources pour utiliser le modèle ADO.
 
J?ai réussi à connecter la base. J?arrive également à faire les requètes. Mais j?ai un problème au niveau de la mise à jour des données :
 
J?ai l?erreur suivante :
 
« Une opération en plusieurs étapes a généré des erreurs. Vérifier chaque valeur d?état. »
 
Voilà ce que j?ai fait :
 
Set Ds = New ADODB.Recordset
Ds.CursorType = adOpenStatic
Ds.CursorLocation = adUseClient
Ds.CacheSize = 100
Ds.ActiveConnection = CNXION
Ds.LockType = adLockOptimistic
Ds.Open "Select * From Devise Where CodeDevise = """ & Text1.Text & """;"
Ds.MoveFirst
Set FldDevise = Ds.Fields("Devise" )
FldDevise.Value = Text2.Text        ****** Erreur à ce niveau
Ds.Update  
 
 
 
Si quelqu?un avait une idée ça m?aiderai énormément.                                          

mood
Publicité
Posté le 30-04-2003 à 10:10:22  profilanswer
 

n°377725
mario51
Posté le 30-04-2003 à 10:54:18  profilanswer
 

gar6more74 a écrit :

Bonjour,
 
Je développe une application de gestion vers une base de donnée Access. Je suis entrain de migrer cette application pour l?utiliser avec MySQL. Je dois modifier mes sources pour utiliser le modèle ADO.
 
J?ai réussi à connecter la base. J?arrive également à faire les requètes. Mais j?ai un problème au niveau de la mise à jour des données :
 
J?ai l?erreur suivante :
 
« Une opération en plusieurs étapes a généré des erreurs. Vérifier chaque valeur d?état. »
 
Voilà ce que j?ai fait :
 
Set Ds = New ADODB.Recordset
Ds.CursorType = adOpenStatic
Ds.CursorLocation = adUseClient
Ds.CacheSize = 100
Ds.ActiveConnection = CNXION
Ds.LockType = adLockOptimistic
Ds.Open "Select * From Devise Where CodeDevise = """ & Text1.Text & """;"
Ds.MoveFirst
Set FldDevise = Ds.Fields("Devise" )
FldDevise.Value = Text2.Text        ****** Erreur à ce niveau
Ds.Update  
 
 
 
Si quelqu?un avait une idée ça m?aiderai énormément.                                          
 


 
 
je pense que tu n'a pas besoin du .value.
fais juste :
FldDevise = Text2.Text        

n°377735
drasche
Posté le 30-04-2003 à 11:03:24  profilanswer
 

Ce n'est pas qu'il n'en a pas besoin (c'est juste plus rapide pour VB de savoir qu'il doit assigner une donnée à .Value que de le deviner tout seul comme un grand au runtime)
 
C'est bien plus compliqué que cela, mais pas difficile à résoudre: c'est une erreur capillotractée pour dire: j'ai reçu une valeur qui ne correspond pas au modèle de données du recordset.  Les possibilités sont nombreuses: donnée trop grande pour le champ, des caractères alphabétiques assignés à du numérique, etc....
 
Sur le moment il ne te dit rien car les .Value sont de type Variant, donc acceptent n'importe quoi.
 
Bref je te conseille de bien regarder ce que tu donnes en pâture à ton recordset, et de le comparer à ton modèle de données ;)


Message édité par drasche le 30-04-2003 à 11:05:01

---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
n°377975
gar6more74
Posté le 30-04-2003 à 12:06:03  profilanswer
 

D'abord merci à tous pour vos réponses.
Ca serait un problème de type de données.
Je vais chercher dans cette direction.
 
Pourtant dans ma base mon champ "Devise" est un Varchar(50). Ca devrait pas poser de problème avec Text2.text qui est aussi un string.
 
 

n°378047
drasche
Posté le 30-04-2003 à 12:51:44  profilanswer
 

si ton champ TextBox accepte plus de 50 caractères, il y a un risque de bug.  Heureusement, il existe (en tout cas pour VB6) une propriété nommée MaxLength qui permet de fixer définitivement le nombre de caractères acceptables pour ce TextBox, donc de limiter le risque que cette erreur surgisse.


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
n°378202
gar6more74
Posté le 30-04-2003 à 14:11:19  profilanswer
 

Merci pour l'info. Ca peut servir mais c'est malheureusement pas ca qui est la cause du problème.
(Mon champs accepte 50 caractères et j'utilise mon textbox avec 5 ou 6 caractères.)
Mais j'apprécie ton aide.
 

n°378208
drasche
Posté le 30-04-2003 à 14:17:54  profilanswer
 

tu n'as pas d'autres champs dans ton recordset? :??:  


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
n°378261
gar6more74
Posté le 30-04-2003 à 14:57:10  profilanswer
 

Non Voila ma requete :
 
Set Ds = New ADODB.Recordset
Ds.CursorType = adOpenKeyset
Ds.CursorLocation = adUseClient
Ds.CacheSize = 100
Ds.ActiveConnection = CNXION
Ds.LockType = adLockOptimistic
Ds.Open "Select Devise From Devise Where CodeDevise = """ & Text1.Text & """;"
 
c = 0
While Not (Ds.EOF)
   c = c + 1
   Ds.MoveNext
Wend
If c>0 then
    Dim FldDevise As ADODB.Field
    Set FldDevise = Ds.Fields("Devise" )
    FldDevise.Value = Text2.Text
    Ds.update
End if
 
 
 
Comme tu vois j'utilise que "Devise". Je vois vraiment pas ce qui cloche là dedans...
Il trouve bien un enregistrement pourtant.
 
 :kaola:

n°378306
drasche
Posté le 30-04-2003 à 15:12:15  profilanswer
 

pas la peine d'être désagréable hein :o
 
Essaie donc de ramener l'ensemble des champs pour cette table plutôt que la devise seule et réessaie.  Le problème d'update peut être lié au fait qu'il ne trouve pas la clé primaire pour remettre à jour la table sur le serveur, tout bêtement, car ici je vois que tu utilises un recordset de type client.  J'aurais même été 100% sûr du problème si le recordset avait été déconnecté mais ce n'est pas le cas ici.
 
Une remarque qui simplifierait ton code: tu peux créer et ouvrir ton recordset en 4 lignes seulement:
 

Code :
  1. Set Ds = New ADODB.Recordset
  2. Ds.CursorLocation = adUseClient
  3. Ds.CacheSize = 100
  4. DS.Open requête, CNXION, adOpenKeySet, adLockOptimistic, adCmdText


 
le adCmdText spécifie que tu envoies une requête comme source, ça évite au parseur ODBC de se figurer ce qu'il a reçu (un léger gain de temps donc).
 
Quant à ta variable Field, honnêtement, elle ne sert à rien ;)


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
n°378592
gar6more74
Posté le 30-04-2003 à 16:16:14  profilanswer
 

Désolé si tu as cru que j'étais enervé. C'est pas du tout le cas et j'apprecie ton aide.
J'ai suivi tes conseils. J'ai mis une * dans ma requete pour selectionner tous les champs. Ca fonctionne pas.
J'ai essayé en mettant aussi adUseServer au lieu de adUseClient. Pas mieux.
Bref, c'est pas gagné !
 
C'est pas le seul endroit oû j'ai cette erreur. Pour d'autres requetes impliquant d'autres tables, ca fait la même chose.
 
J'ai fait un autre test qui me laisse perplexe :
J'ai été dans ma table et j'ai mis Devise = "DEVISEATESTER"
Au lieu de modifier le champ devise avec Text2.text, j'ai mis :
Ds!Devise="DEVISEATESTE"
Et là ca marche !
Je recommence en mettant :  Ds!Devise="DEVISEATEST"
Ca marche encore.
Si je refais Ds!Devise="DEVISEATEST", il me dit cette fois que la ligne n'a pu etre trouvé pour la mise à jour.  
Je recommence en mettant : Ds!Devise="DEVISEAT"
Ca marche. Par contre si j'ajoute une lettre il me met une erreur. (ex Ds!Devise="DEVISEATU" )
Je sais pas si ca t'eclaire.
 
 
 
 

mood
Publicité
Posté le 30-04-2003 à 16:16:14  profilanswer
 

n°378829
drasche
Posté le 30-04-2003 à 19:30:08  profilanswer
 

pas vraiment :sweat:  je commence à perdre mon latin...
 
Quand l'erreur se présente, regarde ce qu'ils disent dans l'aide pour cette erreur.  Si je me rappelle bien, ils décrivent plusieurs cas où cette erreur est susceptible d'apparaître, et celle que j'ai citée est la seule qui me revient de mémoire (parce que c'est la plus courante justement :D)
 
Bonne chance :sweat:
 
(note pour le smiley: ouf c'était bien un malentendu.  C'est parce que tu as employé kaola, qu'on peut traduire par "je te merde", suffit de voir comme il est fâché :D  il serait plus judicieux d'employer :p ou :na:)
 
;)


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
n°379261
gar6more74
Posté le 01-05-2003 à 11:25:12  profilanswer
 

Merci quand même pour ton aide.
Sinon je ferais gaffe au choix des smiley...
 
 
A+


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  problème avec la mise à jour de données en VB avec ADO

 

Sujets relatifs
[ Python ] Problème avec TkinterPitit probleme de selection (UP prob 2)
Problème d'activeX = Comdlg32.ocxproblème avec tomcat
[C]probleme de if forMise à jour d'un formulaire par selection d'un champ :/
[shell] probleme sed pour substitution (help 60 fichiers)Gros gros probleme en access......
[ASP.net]Problème pour passer des paramètres d'une page à une autre 
Plus de sujets relatifs à : problème avec la mise à jour de données en VB avec ADO


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR