VB6调用Crystal Report 8时触发Error 20507错误求助
VB6 + Crystal Report 8 报表启动失败(crpt.Action = 2报错)
问题背景
接手客户提供的旧VB6项目,已解决90%的运行问题,但启动Crystal Report 8报表时触发错误,错误定位在代码中crpt.Action = 2行。后续添加错误处理获取到具体错误信息,尝试注册crpe32.dll和dwmapi.dll时失败。
报错代码
触发错误的VB6打印按钮事件代码:
Private Sub cmdPrint_Click() Screen.MousePointer = vbArrowHourglass db.Execute ("Delete from TempReports") db.Execute ("Delete from TempReports1") With vsFlx For I = 1 To .Rows - 1 db.Execute ("insert into TempReports (field1,field2,field3,field4,field5,field6,field7,field8, field19,field20,field14,field15,field16,field17,field18,field13,field21,field22) values ('" & .TextMatrix(I, 0) & "','" & .TextMatrix(I, 1) & "','" & .TextMatrix(I, 2) & "','" & .TextMatrix(I, 3) & "','" & .TextMatrix(I, 4) & "','" & .TextMatrix(I, 5) & "','" & .TextMatrix(I, 6) & "','" & .TextMatrix(I, 7) & "','" & MaskStartDate.Text & "','" & MaskEndDate.Text & "','" & fixquotes(lblItemGroup.Caption) & "','" & fixquotes(lblSubGroup.Caption) & "','" & fixquotes(lblSubsubGroup.Caption) & "','" & fixquotes(lblItemName.Caption) & "','" & fixquotes(lblMainItemName.Caption) & "'," & Val(txtBalanceQty) & ",'" & lblTotQtyIn.Caption & "','" & lblTotQtyOut.Caption & "') ") Next End With With vsFlx2 For I = 1 To .Rows - 1 db.Execute ("insert into TempReports1 (field1,field2,field3,field4,field5,field6,field7,field8, field19,field20) values ('" & .TextMatrix(I, 0) & "','" & .TextMatrix(I, 1) & "','" & .TextMatrix(I, 2) & "','" & .TextMatrix(I, 3) & "','" & .TextMatrix(I, 4) & "','" & .TextMatrix(I, 5) & "','" & .TextMatrix(I, 6) & "','" & .TextMatrix(I, 7) & "','" & MaskStartDate.Text & "','" & MaskEndDate.Text & "') ") Next End With crpt.ReportFileName = "reports\StockLedger.rpt" crpt.SQLQuery = "Select * from TempReports order by id" crpt.DiscardSavedData = True crpt.WindowShowPrintSetupBtn = True crpt.Action = 2 ' 错误发生在此行 crpt.Destination = crptToWindow Screen.MousePointer = vbDefault End Sub
已尝试操作
- 添加错误处理逻辑获取到具体错误信息
- 尝试注册
crpe32.dll和dwmapi.dll,但注册失败
解决方案建议
1. 验证报表路径与权限
- 将报表路径改为绝对路径测试,避免相对路径问题:
crpt.ReportFileName = App.Path & "\reports\StockLedger.rpt" - 检查程序运行目录、报表目录、数据库文件是否具有读写权限(尤其是临时表
TempReports所在数据库的写入权限)
2. 修复Crystal Report组件注册
- 注意位数匹配:Crystal Report 8是32位组件,需使用32位版本的
regsvr32(位于C:\Windows\SysWOW64\regsvr32.exe)执行注册,命令示例:C:\Windows\SysWOW64\regsvr32.exe "C:\Program Files (x86)\Seagate Software\Crystal Reports\crpe32.dll" - 若找不到
crpe32.dll,需重新安装Crystal Report 8官方32位运行时包,不要仅复制单独的dll文件 dwmapi.dll是Windows Vista及以上系统的窗口管理组件,Crystal Report 8并不依赖它,无需强行注册
3. 检查临时表与报表数据源匹配
- 确认
TempReports表的字段结构(名称、数据类型、长度)与StockLedger.rpt设计时的数据源完全一致 - 验证
crpt.SQLQuery中的order by id:检查TempReports表是否存在id字段,若不存在会导致查询失败 - 检查临时表插入语句中的数据类型匹配:比如
Val(txtBalanceQty)转换后的数值是否符合对应字段的数值类型,避免插入数据时类型不匹配
4. 增强错误调试
- 在
crpt.Action = 2前后添加详细错误捕获,输出完整错误信息以便定位:On Error Resume Next crpt.Action = 2 If Err.Number <> 0 Then MsgBox "错误代码:" & Err.Number & vbCrLf & "错误描述:" & Err.Description Err.Clear End If On Error GoTo 0 - 调试时手动查询
TempReports表,确认数据是否已正确插入
5. 检查VB6工程与运行时环境
- 确认VB6工程中已正确引用Crystal Report 8的控件(比如
Crystal Report Control 8) - 确保运行环境安装了完整的Crystal Report 8运行时组件,包括所有依赖的dll文件
内容的提问来源于stack exchange,提问作者maddy23285
相关产品推荐
相关产品推荐

