谢谢!!时间匆忙,有不明白请提出。
问题:用ado.recordset 的 updatebatch 保存修改时出错,提示无法为更新定位行,一些值可能在最后一次已更改。'aSet.Open sql, gCN, adOpenStatic, adLockBatchOptimistic 程序已经打开纪录集Private Sub cmdSave_Click()
    On Error GoTo errHandle    If aSet Is Nothing Or bSet Is Nothing Then
        Exit Sub
    End If
    If aSet.State = 0 Then
        Exit Sub
    End If    If MsgBox("Save?", vbYesNo) = vbNo Then
        Exit Sub
    End If    ConnectDB gCN, EDI_REGION    Set grid1.DataSource = Nothing   gCN.BeginTrans
   Set aSet.ActiveConnection = gCN    If aSet.RecordCount > 0 Then
        aSet.MoveFirst
        Do While Not aSet.EOF
            aSet(7).Value = aSet(5).Value - aSet(6).Value
            aSet.MoveNext
        Loop
    End If
 
    aSet.UpdateBatch adAffectAll '程序到此总出错,提示无法为更新定位行,一些值可能在最后一次已更改。
    gCN.CommitTrans
    Set aSet.ActiveConnection = Nothing    Set grid1.DataSource = aSet
    grid1.Refresh
    
    aSet.Requery '到此处表格控件中仍然是修改后的纪录
 
    DisConnectDB gCN
    Screen.MousePointer = vbDefault    MsgBox "Save OK"
    SetStatus "Save OK"
    Exit Sub
errHandle:
    MsgBox Err.Description
    gCN.RollbackTrans
    SetStatus Err.Description
    Set aSet.ActiveConnection = Nothing
    DisConnectDB gCN
End Sub

解决方案 »

  1.   


      把这一句aSet.UpdateBatch adAffectAll放到循环里面去看看?
      

  2.   

    Do While Not aSet.EOF
        aSet(7).Value = aSet(5).Value - aSet(6).Value
        aSet.MoveNext
        aset.update                  '记得以前这样做过,楼主试一下
    LoopaSet(7).Value  ??是一个同名数组?
    而且记录集什么也没做啊
      

  3.   

    aSet(7).Value  是 aSet.field(7).value 的缩写 。
      

  4.   

    尽管对于动态游标和仅向前游标 Supports(adUpdateBatch) 可能是真,但对于批处理更新应使用键集游标或静态游标。请将 LockType 属性设置为 adLockBatchOptimistic,然后将 CursorLocation 属性设置为 adUseClient 以启用批更新需要的引擎 Microsoft Client Cursor Engine。
    adUseClient 设置了吗?
      

  5.   

    adUseClient设置了,adLockBatchOptimistic设置了。如上已说明。控件是ms自带的dataGrid 。ado版本是2.6  thank you.
      

  6.   

    设关键字段??RowNum是主键,已經設置了。
      

  7.   

    Private Conn As New ADODB.Connection
    Private Rstn As New ADODB.RecordsetPrivate Sub Command1_Click()
    If Rstn.RecordCount > 0 Then
            Rstn.MoveFirst
            Do While Not Rstn.EOF
                Rstn(2).Value = Rstn(1).Value - Rstn(0).Value
                'Rstn.Update
                Rstn.MoveNext
                'Rstn.UpdateBatch adAffectAll
            Loop
     End IfRstn.UpdateBatch adAffectAll
    End Sub Private Sub Command2_Click()
    Conn.Execute "Alter Table aa Drop DD"
    Conn.Execute "Alter Table aa Add DD long null"
    Rstn.Requery
    End SubPrivate Sub Form_Load()
    Conn.CursorLocation = adUseClient
    Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=f:\db.mdb;User ID=admin;Password=;Jet OLEDB:Database Password="
    Rstn.Open "Select * From aa", Conn, adOpenStatic, adLockBatchOptimistic
    End Sub
    你的代码没有问题我是用上面的代码试的如果你在批更新后又删除了,然后再想批更新的话请你用 Rstn.Requery    刷新一下记录集再进行批更新,就不会出现这个错误了在
      Rstn.UpdateBatch adAffectAll 前加上 Rstn.Requery
    也可把 Rstn.UpdateBatch adAffectAll 改成 Rst.UpdateBatch adAffectAllChapters 试试
      

  8.   

    把你的这句去掉试试
       aSet.UpdateBatch adAffectAll