如何通过VB.Net代码打印受密码保护的Access数据库中的报表
实现带密码Access数据库报表打印的修改方案
核心修改说明
- 现有代码的核心问题是
OpenCurrentDatabase方法没有传入数据库密码参数,同时存在变量未赋值、提前关闭数据库、未释放COM对象的问题 - Access的
OpenCurrentDatabase方法支持传入第三个参数作为数据库密码,格式为OpenCurrentDatabase(数据库路径, 是否独占打开, 密码字符串) - 你声明的
acViewPreview变量未赋值,直接使用会导致报表打开模式异常,可以直接引用枚举值避免出错 - 不要在打开报表后立刻执行
CloseCurrentDatabase,会导致报表刚打开就被强制关闭 - 代码执行完成后需要主动释放Access COM对象,避免Access进程残留在后台
修改后完整代码
Private Sub btnPrint_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAfdrukken.Click Dim moApp As Access.Application = Nothing Try ' 先尝试获取已运行的Access实例,不存在则新建 Try moApp = DirectCast(GetObject(, "Access.Application"), Access.Application) Catch ex As Exception moApp = DirectCast(CreateObject("Access.Application"), Access.Application) End Try moApp.Visible = True ' 替换第三个参数为你的Access数据库实际密码 moApp.OpenCurrentDatabase("D:\media\urine (1).ACCDB", False, "你的数据库密码") moApp.RunCommand(Access.AcCommand.acCmdAppMaximize) moApp.DoCmd.Maximize() moApp.DoCmd.SetWarnings(False) ' 直接使用枚举值,不需要额外声明变量 ' 如果需要直接打印不预览,把acViewPreview改成acViewNormal moApp.DoCmd.OpenReport("report1bw", Access.AcView.acViewPreview) ' 如果是直接打印模式,等待打印任务提交后再关闭数据库 ' 预览模式下不要自动关闭,等用户手动操作后再处理,或者可以监听Access的关闭事件 ' 此处如果是预览场景可以注释掉下面的关闭语句,或者根据你的业务逻辑调整时机 ' moApp.CloseCurrentDatabase() Catch ex As Exception MessageBox.Show(ex.Message, "Access报表打印错误", MessageBoxButtons.OK, MessageBoxIcon.Exclamation) Finally ' 释放COM对象,避免残留Access后台进程 If moApp IsNot Nothing Then ' 不需要保留Access实例的话可以直接取消注释调用退出 ' moApp.Quit() System.Runtime.InteropServices.Marshal.ReleaseComObject(moApp) moApp = Nothing End If End Try End Sub
注意事项
- 如果你的Access使用的是旧版MDW用户组权限验证的用户级安全机制,需要额外通过
System.Data.OleDb或者修改Access启动参数传入工作组文件、用户名、密码,上述方案仅适用于ACCDB格式的单数据库密码保护场景 - 如果需要无预览直接打印,只需要将
OpenReport的第二个参数修改为Access.AcView.acViewNormal,可以静默触发打印任务 - 密码中如果包含特殊字符不需要额外转义,直接作为字符串传入即可
内容的提问来源于stack exchange,提问作者mokhtar
相关产品推荐
相关产品推荐

