Personne ne maitrise "UPDATE" d'ADO ?

ruth -  
 Larbi -
Bonjour à tous!!
SVP je me permets de vous reponser mon probleme;
svp je fais un update sur un objet ADODB.recordset sur vb6 (pour modifier les valeurs contenues dans une colonne ,les diviser par 3 ).
J'obtient comme erreur:
"Row cannot be located for updating. Some values may have been changed since it was last read". erreur numero -2147217864
au moment ou je fais un movenext (pr modifier la ligne suivante)!!
SVP voyez vous ou il ya probleme?
merci!!
A voir également:

8 réponses

blux Messages postés 27997 Date d'inscription   Statut Modérateur Dernière intervention   3 367
 
Salut,

ben a priori, tes valeurs ont été modifiées entre le temps où tu les as lues et celui où tu veux les récrire... Peut-être même qu'elles n'existent plus...

c'est quoi comme base ?
elle est multi-user ?

y'a pas des sessions/transactions du genre rollback, commit ?

A+ Blux "Les cons, ça ose tout.
C'est même à ça qu'on les reconnait"
0
ruth
 
Salut!
C'est une base oracle 8 ;elle n'est pas multi user!
il n'y'a pas des sessions/transactions du genre rollback, commit !!
meme en faisant un requery sur mon recorset pr rafraichissement ,le meme probleme se pose;
bien sur je peux executer une requete du gere "UPDATE...." sur chacune des 10 0000 lignes de ma table pr mettre à jour une colonne ,mais cette opération prendrait beaucout plus de temps...
voila pourqoui je souhaite faire une seule connection en ouvrant un rst et en utilisant update!
Merci
0
blux Messages postés 27997 Date d'inscription   Statut Modérateur Dernière intervention   3 367
 
euh si je puis me permettre, un UPDATE en SQL durerait moins longtemps, puisque dans ce cas, il envoie le SQL à ORACLE qui lance une seule requête, alors que dans le cas d'un recordset avec movenext, il y a autant d'envois de modifs que de movenext.

et on dira ce qu'on voudra, ORACLE va verouiller la table/ligne avant de faire la mise à jour puis libérer si OK et ça 10000 fois s'il le faut... alors qu'avec UPDATE en SQL, il va verrouiller une seule fois et faire son commit à la fin...

mais bon, c'est juste mon avis... :-)

A+ Blux "Les cons, ça ose tout.
C'est même à ça qu'on les reconnait"
0
deus Messages postés 93 Statut Membre 91
 
Salut ruth,

Je suis d'accord avec Blux.
Néanmoins pour répondre à ta question, l'idée est que tu dois "rafraichir" les données de ton recordset.
ex :
"Private Sub SaveMailing()
rst1.Fields("MailingSourceHtml") = TxtHtmlSource.Text
rst1.Fields("Beschrijving") = TxtBesch.Text
rst1.Fields("ModifyDate") = Now()
rst1.Update
End Sub"

Quand j'appuyais 2 x de suite sur cette commande, VB me retournait la même erreur que toi. La solution a été de rajouter rst1.Requery :
"
Private Sub SaveMailing()
rst1.Fields("MailingSourceHtml") = TxtHtmlSource.Text
rst1.Fields("Beschrijving") = TxtBesch.Text
rst1.Fields("ModifyDate") = Now()
rst1.Update
rst1.Requery
End Sub
"
J'espère que ca t'aura aidé.

dEUS
There's no success like failure
And failure's no success at all
0

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

Posez votre question
ruth
 
SVP pour diviser toute les valeur d'un champ par une constante n'ya til pas moyen de le faire directement par une requete sql du genre:
"UPDATE customer SET Macolone = macolone/5"?
Merci
0
blux Messages postés 27997 Date d'inscription   Statut Modérateur Dernière intervention   3 367
 
bien sûr que si !
c'est ce que j'ai suggéré en disant qu'UNE seule requête pouvait le faire... :-)

A+ Blux "Les cons, ça ose tout.
C'est même à ça qu'on les reconnait"
0
ruth
 
OK merci deus ! je teste ta proposition
Merci
0
ruth
 
en faisant:
do while rst1.eof=false
.....
rst1.Update
rst1.Requery
rst1.movenext 'pr passer la modif de ligne suivante
loop

la meme erreur se produit des le premier update
0
Larbi
 
Pour mettre a jour votre recordset avec Update (dans votre cas) , et eviter ce message, ajouter 1 cle ou 1 identite a votre table,
car la ligne doit etre identifiee pour etre mise a jour.
0