用 
do until rs.eof
.........
rs.movenext
loop

解决方案 »

  1.   

    把rsdes.update 放在 next之前
      

  2.   

    ...
    do while not rsdes.eof
    For i = 0 To rs.Fields.Count - 1
      If Not IsNull(rs(rs(i).Name)) Then
          rsdes(rs(i).Name) = Trim(rs(rs(i).Name))
      Else
        rsdes(rs(i).Name) = Null
      End If
    Next
      rsdes.Update
      rsdes.movenext
    loop
      

  3.   

    还是不行!  rsdes 是要更新的记录集!rs 是数据源。
      

  4.   

    Dim strsource As String
    Dim i As Integer
    Set rs = New ADODB.Recordset
    Set rsdes = New ADODB.Recordset
    strsource = "select * from info "
    rs.Open strsource, cn, adOpenkeyset, adLockOptimistic
    rsdes.Open strsource, cndes, adOpenkeyset, adLockOptimistic
    If rsdes.RecordCount = 0 Then rsdes.AddNew
    do until rsdes.eof 
    For i = 0 To rs.Fields.Count - 1
      If Not IsNull(rs(rs(i).Name)) Then
          rsdes(rs(i).Name) = Trim(rs(rs(i).Name))
      Else
        rsdes(rs(i).Name) = Null
      End If
      Next
      rsdes.Update
    rsdes.movenext
    loop
      

  5.   

    楼上的解答是对的。recordset 一次只能对应一条数据,不是一个表的所有数据。
      

  6.   

     to: cqing() :我用了循环也不行吗???请教!!!谢谢!!1
      

  7.   

    For i = 0 To rs.Fields.Count - 1
     if rsdes.eof=true then Then rsdes.AddNew
     If Not IsNull(rs(rs(i).Name)) Then
          rsdes(rs(i).Name) = Trim(rs(rs(i).Name))
      Else
        rsdes(rs(i).Name) = Null
      End If
     rsdes.Update
     rsdes.movenext
     rs.movenext
    Next
      

  8.   

    还是不行!
    出现错误:Either bof or eof is true,or the current recorder has been delted requested operation requaires a current record
    对了。我的rsdes里面时空的。没有纪录。但是字段都有!!!!急!!!!
      

  9.   

    Dim strsource As String
    Dim i As Integer
    Set rs = New ADODB.Recordset
    Set rsdes = New ADODB.Recordset
    strsource = "select * from info "
    rs.Open strsource, cn, adOpenDynamic, adLockOptimistic
    rsdes.Open strsource, cndes, adOpenDynamic, adLockOptimisti
    For i = 0 To rs.Fields.Count - 1
    rsdes.AddNew
    If Not IsNull(rs(rs(i).Name)) Then
          rsdes(rs(i).Name) = Trim(rs(rs(i).Name))
      Else
        rsdes(rs(i).Name) = Null
      End If
    rsdes.Update
    rs.movenext
    Next 这样行不行?
      

  10.   

    对不起,刚才没有看清楚,这样应该行了:
    Dim strsource As String
    Dim i As Integer
    Set rs = New ADODB.Recordset
    Set rsdes = New ADODB.Recordset
    strsource = "select * from info "
    rs.Open strsource, cn, adOpenkeyset, adLockOptimistic
    rsdes.Open strsource, cndes, adOpenkeyset, adLockOptimistic
    If rsdes.RecordCount = 0 Then rsdes.AddNew
    do until rs.eof 
    For i = 0 To rs.Fields.Count - 1
      If Not IsNull(rs(rs(i).Name)) Then
          rsdes(rs(i).Name) = Trim(rs(rs(i).Name))
      Else
        rsdes(rs(i).Name) = Null
      End If
      Next
      rsdes.Update
      rs.movenext
      rsdes.AddNewloop 
      

  11.   

        Dim strsource As String
        Dim i As Integer
        
        Dim rs As New ADODB.Recordset
        Dim rsdes As New ADODB.Recordset
        
        strsource = "select * from info "
        rs.Open strsource, cn, adOpenDynamic, adLockOptimistic
        rsdes.Open strsource, cndes, adOpenDynamic, adLockOptimisti
        
        With rs
            Do While Not .EOF
                For i = 0 To rs.Fields.Count - 1
                  rsdes(rs(i).Name) = IIf(IsNull(rs(rs(i).Name).Value), Null, Trim(rs(rs(i).Name).Value))
                Next i
            Loop
            .MoveNext
        End With
      

  12.   

    to  ozw(沧浪客):你的方法不行!死机了!也许是循环不对
      

  13.   

    to ozw(沧浪客)
    你的程序很间洁,不怕人家看不懂?还有,你漏了rsdes.addnew rsdes.update
      

  14.   

    to ozw(沧浪客)
    你怎么把movenext放到循环外面了?这不是死循环?
    to lzy5042(老山) 
    你两个表的结构完全一样吗?
      

  15.   

    Dim strsource As String
    Dim i As Integer
    dim j as long
    Set rs = New ADODB.Recordset
    Set rsdes = New ADODB.Recordset
    strsource = "select * from info "
    rs.Open strsource, cn, adOpenDynamic, adLockOptimistic
    rsdes.Open strsource, cndes, adOpenDynamic, adLockOptimisti
    If rsdes.RecordCount = 0 Then rsdes.AddNew
    for j = 0 to rsdes.recordcount-1
    For i = 0 To rs.Fields.Count - 1
      If Not IsNull(rs(rs(i).Name)) Then
          rsdes(rs(i).Name) = Trim(rs(rs(i).Name))
      Else
        rsdes(rs(i).Name) = Null
      End If
      Next i
      rsdes.Update
    rsddes.movenext
    next j
      

  16.   

    Dim strsource As String
    Dim i As Integer
    Set rs = New ADODB.Recordset
    Set rsdes = New ADODB.Recordset
    strsource = "select * from info "
    rs.Open strsource, cn, adOpenDynamic, adLockOptimistic
    rsdes.Open strsource, cndes, adOpenDynamic, adLockOptimisti
    If rsdes.RecordCount = 0 Then
    For i = 0 To rs.Fields.Count - 1
      If Not IsNull(rs(rs(i).Name)) Then
          rsdes.addnew
          rsdes(rs(i).Name) = Trim(rs(rs(i).Name))
      Else
        rsdes(rs(i).Name) = Null
      End If
      rsdes.update
      NextADDNEW和UPDATE的位置放的不对!!
      

  17.   

    刚才没看清,还以为只更新一个字段
    Dim strsource As String
    Dim i As Integer
    Set rs = New ADODB.Recordset
    Set rsdes = New ADODB.Recordset
    strsource = "select * from info "
    rs.Open strsource, cn, adOpenDynamic, adLockOptimistic
    rsdes.Open strsource, cndes, adOpenDynamic, adLockOptimisti
    while rs.EOF=false
     rsdes.AddNew
     For i = 0 To rs.Fields.Count - 1
      If Not IsNull(rs(rs(i).Name)) Then
          rsdes(rs(i).Name) = Trim(rs(rs(i).Name))
      Else
        rsdes(rs(i).Name) = Null
      End If
     next i
     rsdes.Update
     rs.movenext
    wend
      

  18.   

    xlain(lain)的应该没问题了吧?
      

  19.   

    对不起,我没测过我的代码,忘了Update了
        
        With rs
            Do While Not .EOF
                rsdes.Addnew   
                For i = 0 To rs.Fields.Count - 1
                  rsdes(rs(i).Name).value = IIf(IsNull(rs(rs(i).Name).Value), Null, Trim(rs(rs(i).Name).Value))
                Next i
                rsdes.Update  
            Loop
            .MoveNext
        End With
      

  20.   

    还是有些繁琐,简洁一点
        With rs
            Do While Not .EOF
                rsdes.AddNew
                For i = 0 To .Fields.Count - 1
                  rsdes(i).Value = IIf(IsNull(rs(i).Value), Null, Trim(rs(i).Value))
                Next i
                rsdes.Update
            Loop
            .MoveNext
        End With
      

  21.   

    今天头晕,又忘了.MoveNext的位置不对了
        With rs
            Do While Not .EOF
                rsdes.AddNew
                For i = 0 To .Fields.Count - 1
                  rsdes(i).Value = IIf(IsNull(rs(i).Value), Null, Trim(rs(i).Value))
                Next i
                rsdes.Update
                .MoveNext
            Loop
        End With
      
      

  22.   

    to ozw(沧浪客):还是不行!只能添加一条纪录!还是最后一个!!!
      

  23.   

     '以我的的经验,以下方式应该是最快的更新方式
      Dim StrSource As String
      Dim Rs As ADODB.Recordset
      Dim I As Long
        Set Rs = New ADODB.Recordset
        StrSource = "select * from info "
        '=====================
        '注意打开方式为,静态、成批
        Rs.Open StrSource, cn, adOpenStatic, adLockBatchOptimistic
        '=====================
        If Rs.RecordCount > 0 Then
         Rs.MoveFirst
         Do While Rs.EOF = False
          For I = 0 To Rs.Fields.Count - 1
           If Not IsNull(Rs.Fields(I).Value) Then             '判断是否为NULL
             If TypeName(Rs.Fields(I).Value) = "String" Then  '判断字段是否为String型
               Rs.Fields(I).Value = Trim(Rs.Fields(I).Value)
             End If
           End If
          Next I
          Rs.MoveNext                                          '移向下一条记录
         Loop
         Rs.UpdateBatch adAffectAllChapters                    '一次性成批修改记录集
        End If
      

  24.   

    在你的提问中没有说清楚你要完成的功能,我只能靠猜了。你是不是想将一个表中的所有记录者复制到另一个表中?如是,请见下面解答:
    Dim strsource As String
    Dim i As Integer
    Set rs = New ADODB.Recordset
    Set rsdes = New ADODB.Recordset
    strsource = "select * from info "
    rs.Open strsource, cn, adOpenDynamic, adLockOptimistic
    rsdes.Open strsource, cndes, adOpenDynamic, adLockOptimistic
    do while not rs.eof
      rsdes.addnew
      For i = 0 To rs.Fields.Count - 1
        If Not IsNull(rs(rs(i).Name)) Then
            rsdes(rs(i).Name) = Trim(rs(rs(i).Name))
        Else
          rsdes(rs(i).Name) = Null
        End If
      Next
      rsdes.Update
      rs.movenext
    loop
      

  25.   

    此句毫无意义! Null 既然可以直接赋值 为什么还要绕来绕去?    If Not IsNull(rs(rs(i).Name)) Then
            rsdes(rs(i).Name) = Trim(rs(rs(i).Name))
        Else
          rsdes(rs(i).Name) = Null
        End 一句  rsdes(rs(i).Name) =  Trim(rs(rs(i).Name)) 不就够了?    
      

  26.   

    haichuang 的方法大致上不会有问题。真搞不明白, lzy5042 你这段代码到底用意如何?If rsdes.RecordCount = 0 Then rsdes.AddNew
    For i = 0 To rs.Fields.Count - 1  ... 分明就是有问题!
      

  27.   

    非常同意 cuiyxy(沧海鲨鱼) 的回答。
    如果想要全部更新,最快的方法是采用批次更新。即在Recordset打開的時候,指明為批次鎖定的方法。
        Rs.Cursor=adUseClient   'ADO enginer Cursor 為客戶端,否則無法用批次。
        Rs.Open StrSource, cn, adOpenStatic, adLockBatchOptimistic  這樣做的好處是,Recordset取回資料後,可以斷開與DataBase的連線,節省寶貴的Connection.
        Set Rs.ActiveConnection=Nothing   然後,如果需要更新DataBase里的資料的時候,再連上Connection,Update即可。
       Set Rs.ActiveConnection=Cn   
       Rs.UpdateBatch
    千萬不可以在循環里寫上 rs.Update,因為這樣每循環一次,ADO都要與DataBase進行一次會話,這樣會大大影響你程式的效能。