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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 20:24:03