problème avec la mise à jour de données en VB avec ADO - VB/VBA/VBS - Programmation
Marsh Posté le 30-04-2003 à 10:54:18
gar6more74 a écrit : Bonjour, |
je pense que tu n'a pas besoin du .value.
fais juste :
FldDevise = Text2.Text
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
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.
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.
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.
Marsh Posté le 30-04-2003 à 14:17:54
tu n'as pas d'autres champs dans ton recordset?
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.
Marsh Posté le 30-04-2003 à 15:12:15
pas la peine d'être désagréable hein
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 :
|
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
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.
Marsh Posté le 30-04-2003 à 19:30:08
pas vraiment 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 )
Bonne chance
(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é il serait plus judicieux d'employer ou )
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+
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.