You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VB6代码无法实现ADODB记录集数据复制,求排查故障原因

问题:VB6数据库数据复制子程序执行报错,无法完成数据迁移

运行环境

  • 开发环境:纯VB6 SP3(专业版8169)
  • 操作系统:Windows 8.1(版本6.3.9600)
  • 硬件:东芝Satellite S75t-A、Intel Core i7-4700MQ

执行下方DBTrans子程序时弹出报错对话框,该代码旨在将源数据库的Passwords记录集数据复制到目标数据库同名记录集,但无法完成复制,求排查原因:

Public Sub DBTrans()
    Dim OldNum As Integer, NewNum As Integer
    Dim New_CDBS, New_WRS, Old_CDBS, Old_WRS
    Dim Resp, Rec As Integer
    Dim i As Integer
    Dim Txt0, Txt1, Txt2, Txt3, Txt5, Txt6
    
    
    ' Open the Database you are getting records 'FROM'
    Set Old_CDBS = OpenDatabase(SourceDB, True)
    Set Old_WRS = Old_CDBS.OpenRecordset("Passwords", dbOpenDynaset)
    
    ' Open the DataBase you are sending Records 'TO'
    Set New_CDBS = OpenDatabase(DestinationDB, True)
    Set New_WRS = CDBS.OpenRecordset("Passwords", dbOpenDynaset)
    
    On Error GoTo ErrRes
    
    Old_WRS.MoveFirst   ' Initialize Source Database
    Old_WRS.MoveLast
    Old_WRS.MoveFirst
    i = 1
    
    Do Until Old_WRS.EOF = True     'Cycle through all Records in the Source Database in this 'DO' Loop
        With New_WRS
         ' This was a test workaround effort
         '   Txt0 = Old_WRS.Fields(0)
         '   Txt1 = Old_WRS.Fields(1)
         '   Txt2 = Old_WRS.Fields(2)
         '   Txt3 = Old_WRS.Fields(3)
         '   Txt4 = Old_WRS.Fields(4)       ' OR Rec_Num OR i
         '   Txt5 = Old_WRS.Fields(5)
         '   Txt6 = Old_WRS.Fields(6)
        
            .AddNew     ' Add A new Record to the Destination Database
            .Fields(0).Value = Old_WRS.Fields(0)        '= Txt0   ' Location
            .Fields(1).Value = Old_WRS.Fields(1)        '= Txt1   ' Logon
            .Fields(2).Value = Old_WRS.Fields(2)        '= Txt2   ' Password
            .Fields(3).Value = Old_WRS.Fields(3)        '= Txt3   ' Notes - AllowZeroLength Field
            .Fields(5).Value = Old_WRS.Fields(5)        '= Txt5   ' Format(Txt5, "mm/dd/yyyy")
            .Fields(6).Value = Old_WRS.Fields(6)        '= Txt6   ' Name
            
            .Fields(4).Value = Old_WRS.Fields(4)        ' New_Index 'OR' Rec_Num
           
          '  i = i + 1      ' Next index OR Rec_Num
            .Update
            .MoveFirst
            .MoveLast
                        
        End With
        Old_WRS.MoveNext        ' Move to next Source Database Record
        
    Loop                    ' Start Next data Transaction.
    
    ' Old_WRS.RecordCount is complete
    ' now Verify transfer with simple RecordSet.Count comparison
    OldNum = Old_WRS.RecordCount
    NewNum = New_WRS.RecordCount
    Old_WRS.Close
    Old_CDBS.Close
    New_WRS.Close
    Old_CDBS.Close
    
    
    If NewNum = OldNum Then
        MsgBox ("Transfer complete: Old DB = " & OldNum & "Records" & vbCr & "New DB has " & NewNum & "Records."), vbOKOnly
    Else
        MsgBox ("Something went wrong: Old DB = " & OldNum & "Records" & vbCr & "New DB has " & NewNum & " Records."), vbOKOnly
    End If

ErrRes:

    MsgBox "The Following Error Occurred:" & vbCr & vbCr & Err.Description & vbCr & "Aborting Edit Operation", vbOKOnly, "Error Alert"
    Form1.Visible = True
    Form1.Enabled = True
    Unload Form4

End Sub

核心错误排查与修复方案

1. 致命对象引用错误

打开目标记录集时,代码误写为Set New_WRS = CDBS.OpenRecordset(...),但实际定义的目标数据库对象是New_CDBS,这会直接触发“变量未定义”错误,需修改为:

Set New_WRS = New_CDBS.OpenRecordset("Passwords", dbOpenDynaset)

2. 错误处理位置错误

原代码将On Error GoTo ErrRes放在数据库打开操作之后,导致打开数据库时的错误无法被捕获,需将错误处理语句移到子程序开头。

3. 冗余操作导致效率与异常问题

每次添加记录后执行.MoveFirst和.MoveLast完全无必要,会大幅降低迁移效率,且可能引发记录集状态异常,直接删除这两行代码。

4. 重复关闭数据库对象

代码末尾重复执行Old_CDBS.Close,第二次关闭时对象已释放,会触发错误,需改为关闭目标数据库对象:

New_CDBS.Close

5. 未显式声明变量类型

New_CDBS、New_WRS等变量未声明具体类型(应为Database和Recordset),VB6默认视为Variant类型,易引发类型不兼容问题,建议添加Option Explicit并显式声明变量:

Option Explicit
Dim New_CDBS As Database, New_WRS As Recordset
Dim Old_CDBS As Database, Old_WRS As Recordset

6. 错误处理逻辑缺陷

原错误处理块未添加退出语句,会继续执行后续代码引发更多异常,需在正常流程末尾添加Exit Sub,并在错误处理块中确保所有数据库对象被正确关闭。


修复后的完整代码

Option Explicit

Public Sub DBTrans()
    Dim OldNum As Integer, NewNum As Integer
    Dim New_CDBS As Database, New_WRS As Recordset
    Dim Old_CDBS As Database, Old_WRS As Recordset
    
    On Error GoTo ErrRes
    
    ' 打开源数据库
    Set Old_CDBS = OpenDatabase(SourceDB, True)
    Set Old_WRS = Old_CDBS.OpenRecordset("Passwords", dbOpenDynaset)
    
    ' 打开目标数据库
    Set New_CDBS = OpenDatabase(DestinationDB, True)
    Set New_WRS = New_CDBS.OpenRecordset("Passwords", dbOpenDynaset)
    
    ' 定位到源记录集末尾以获取准确记录数
    Old_WRS.MoveLast
    Old_WRS.MoveFirst
    
    ' 循环复制记录
    Do Until Old_WRS.EOF
        With New_WRS
            .AddNew
            .Fields(0).Value = Old_WRS.Fields(0)  ' Location
            .Fields(1).Value = Old_WRS.Fields(1)  ' Logon
            .Fields(2).Value = Old_WRS.Fields(2)  ' Password
            .Fields(3).Value = Old_WRS.Fields(3)  ' Notes
            .Fields(4).Value = Old_WRS.Fields(4)  ' New_Index
            .Fields(5).Value = Old_WRS.Fields(5)  ' 日期字段
            .Fields(6).Value = Old_WRS.Fields(6)  ' Name
            .Update
        End With
        Old_WRS.MoveNext
    Loop
    
    ' 验证记录数
    OldNum = Old_WRS.RecordCount
    NewNum = New_WRS.RecordCount
    
    ' 关闭所有数据库对象
    Old_WRS.Close
    Old_CDBS.Close
    New_WRS.Close
    New_CDBS.Close
    
    ' 提示结果
    If NewNum = OldNum Then
        MsgBox "传输完成:原数据库 = " & OldNum & "条记录" & vbCr & "新数据库 = " & NewNum & "条记录。", vbOKOnly
    Else
        MsgBox "传输异常:原数据库 = " & OldNum & "条记录" & vbCr & "新数据库 = " & NewNum & "条记录。", vbOKOnly
    End If
    
    Exit Sub ' 正常退出,避免进入错误处理

ErrRes:
    MsgBox "发生以下错误:" & vbCr & vbCr & Err.Description & vbCr & "终止操作", vbOKOnly, "错误提示"
    Form1.Visible = True
    Form1.Enabled = True
    Unload Form4
    
    ' 确保所有对象被关闭,避免内存泄漏
    If Not Old_WRS Is Nothing Then Old_WRS.Close
    If Not Old_CDBS Is Nothing Then Old_CDBS.Close
    If Not New_WRS Is Nothing Then New_WRS.Close
    If Not New_CDBS Is Nothing Then New_CDBS.Close
End Sub

内容的提问来源于stack exchange,提问作者RockyFaher

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 21:31:08