Personne ne maitrise "UPDATE" d'ADO ?

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!!

8 réponses

  1. Modérateur
    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
    1. 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
      1. Modérateur
        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
        1. 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
          1. 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
            1. Modérateur
              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
          2. OK merci deus ! je teste ta proposition
            Merci
            0
            1. 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
              1. 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