我要更新记录时出错,代码如下:
With rec
  rec.Fields("col_TransID").Value = txtFields(0).Text
  rec.Fields("col_Name").Value = txtFields(1).Text
  rec.Fields("col_Address").Value = txtFields(2).Text
  rec.Fields("col_SysFunc").Value =txtFields(3).Text
  rec.Fields("col_Tel").Value = txtFields(4).Text
 .UpdateBatch
End With系统都提示:“无法为更新行集定位,一些值可能已在最后读取时改变”
然后停在.UpdateBatch上面,而增加新记录时则没问题,代码如下:
With rec
  .AddNew
  rec.Fields("col_TransID").Value = txtFields(0).Text
  rec.Fields("col_Name").Value = txtFields(1).Text
  rec.Fields("col_Address").Value = txtFields(2).Text
  rec.Fields("col_SysFunc").Value =txtFields(3).Text
  rec.Fields("col_Tel").Value = txtFields(4).Text
  .Update
End With
请高手看看,到底是哪里出错了,多谢!

解决方案 »

  1.   

    col_TransID是否为定义好的主键?一般在组织SQL语句时更新的情况如下:strSQL="Update TableName Set col_Name ='NewValue' Where col_TransID=1234 "如果你将表中所有字段均改变值的话,将无法定位到该条记录,或者你加个[ID]自动生成的主键试试看,应该不会出现这种错误
      

  2.   

    只能对键集或静态游标使用批更新
    对于批处理更新应使用键集游标或静态游标。请将 LockType 属性设置为 adLockBatchOptimistic,然后将 CursorLocation 属性设置为 adUseClient 
    或者在记录不多的情况下用UPDATE逐条更新
      

  3.   


    col_TransID是主键,我只更新了其中的部分字段,不是全部更新。
    我用的是我机器上的数据库,没和别人共用,所以是不会出现两人用同一个表的现象的。
    另外这个问题在Access 中就没问题!
      

  4.   

    Update更新记录,记录全部更新后再调用UpdateBatch,提交到数据库
      

  5.   

    去掉 rec.Fields("col_TransID").Value = txtFields(0).Text 这句试试看?
      

  6.   

    你把rec.Fields("col_TransID").Value = txtFields(0).Text这条去除试试看,我觉得你用这种方法可能定位数据库记录会有问题
      

  7.   

    是:
    With rec
      .Fields("col_TransID").Value = txtFields(0).Text
      .Fields("col_Name").Value = txtFields(1).Text
      .Fields("col_Address").Value = txtFields(2).Text
      .Fields("col_SysFunc").Value =txtFields(3).Text
      .Fields("col_Tel").Value = txtFields(4).Text
     .UpdateBatch
    End With
      

  8.   

    With rec
     .edit  
      rec.Fields("col_TransID").Value = txtFields(0).Text
      rec.Fields("col_Name").Value = txtFields(1).Text
      rec.Fields("col_Address").Value = txtFields(2).Text
      rec.Fields("col_SysFunc").Value =txtFields(3).Text
      rec.Fields("col_Tel").Value = txtFields(4).Text
     .Update
    End With
      

  9.   

    recordset 好像没 .edit 吧
      

  10.   

    这个多半是自动编号的问题:数据库中有一个是自动编号,当你新增一条记录的时候,数据库自动为你加了一个自动编号,而你的显示控件(如datagrid)并不知道,当它去更新数据库内的数据时,和已经添加的自动编号发生了冲突。这里你再起动一次程序,可以发现最后新加一那一条的自动编号已经出现,但这个编号并不是你加的。处理方法:你的记录集不要选这个自动编号,也不显示它。但如果你不需要新增数据的时候,可以带上这个自动编号。
      

  11.   

    我看也是主键的问题,但如何解决呢?我要求也把主键更新。写SQL语句肯定没问题,
    但rec.Update为何不行呢
      

  12.   

    可以肯定不是自动编号的问题,我没定义这个字段,我不知SQLServer会不会自己加上这个字段。
      

  13.   

    数据源连接串采用{SQL Server}驱动试试:
    "Driver={SQL Server};Password=;Persist Security Info=True;UID=sa;DataBase=DBName;Server=Server"
      

  14.   

    没有建触发器,应该不是这方面的问题我要的是更新记录,怎么用Insert呢,Insert不是插入吗
      

  15.   

    flc(知秋一^片^叶) 提的问题也对,用了with ret 后中间的就加个.就可以了
      

  16.   

    你可能使用了ADO的事务,事务回滚后,在事务中已更新的Recordset在数据库中实际被还原了,但Recordset认为成功了。当再次试图更新这个Recordset时,就会出错。
      

  17.   

    这个问题在Access中没问题,在SqlServer2000就会出现。
    这个估计是没人能解决了,论坛版主也不会吗?
      

  18.   

    大兄弟,我看你还是重建个表,重新连接,把字段的类型全改为 vchar,不要主键,包你满意
      

  19.   

    要吗,不要写你那些鬼代码,直接将text控件用adodc绑定,再在 command_click里写:
    on error goto updateerr
    adodc1.recordset.updatebatch
    exit sub
    updateerr:
    msgbox err.description
      

  20.   

    我也遇到相同的问题:只要将rec.CursorLocation=asUseClient改成rec.CursorLocation=asUseServer就行了。至于为什么会出这个错误,我也不清楚;如果哪位高手清楚还望指点一二
      

  21.   

    這個問題我在使用datagrid中間遇見過﹐是自動編號的問題﹐我的對象是access如果你沒有用自動編號﹐只能理解為更新了不該去更新的地方。所以只給建議去檢查一下你數據表的字段。
      

  22.   

    突然想到﹐剛看見一個 貼﹐然后想到剛開始用datagrid和access時候出現一個 問題。還是出現在主鍵﹐因為偶沒有定義一個table的主鍵﹐最后比如數據表中3條數據一樣的時候﹐更新﹐vb無法判斷我到底是更新那一條﹐最后就會出現這個提示﹐然后再去數據庫看﹐更新是更新了﹐但是3條數據全部更新了。sql中我沒有遇見。