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

problème avec la mise à jour de données en VB avec ADO - VB/VBA/VBS - Programmation

Marsh Posté le 30-04-2003 à 10:10:22    

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.                                          

Reply

Marsh Posté le 30-04-2003 à 10:10:22   

Reply

Marsh Posté le 30-04-2003 à 10:54:18    

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        

Reply

Marsh Posté le 30-04-2003 à 11:03:24    

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)
Reply

Marsh Posté le 30-04-2003 à 12:06:03    

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.
 
 

Reply

Marsh Posté le 30-04-2003 à 12:51:44    

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)
Reply

Marsh Posté le 30-04-2003 à 14:11:19    

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.
 

Reply

Marsh Posté le 30-04-2003 à 14:17:54    

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)
Reply

Marsh Posté le 30-04-2003 à 14:57:10    

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:

Reply

Marsh Posté le 30-04-2003 à 15:12:15    

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)
Reply

Marsh Posté le 30-04-2003 à 16:16:14    

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.
 
 
 
 

Reply

Marsh Posté le 30-04-2003 à 16:16:14   

Reply

Marsh Posté le 30-04-2003 à 19:30:08    

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)
Reply

Marsh Posté le 01-05-2003 à 11:25:12    

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed