使用 C#/VBScript 获取 mdb 文件 (msaccess) 中的所有源代码

Posted

技术标签:

【中文标题】使用 C#/VBScript 获取 mdb 文件 (msaccess) 中的所有源代码【英文标题】:Get all source code in mdb file (msaccess) using C#/VBScript 【发布时间】:2009-09-16 04:01:23 【问题描述】:

我想在不使用 Office 互操作的情况下从 Access 数据库(表单、模块)中获取所有源代码。

我喜欢AllCodeToDesktop() 函数found here。但是,它从 mdb 文件内部运行。

加载 mdb 文件并在其上运行该函数的 VBScript 文件是什么?

【问题讨论】:

我只是没有得到这个“不使用 Office”的限制。我从您的问题中了解到,您希望有人为您编写代码,因为您不想使用办公室互操作?我想这不是一个问题,而是你必须付出的代价! 【参考方案1】:

我想获取所有源 访问数据库中的代码(表单、 模块) - 不使用办公室 互操作

需要 Microsoft Office。您不妨将您的函数粘贴到 MDB 中并从那里运行它。

【讨论】:

安装 interops 的问题是你必须为拥有 office 2003 的用户安装 interops 2003,为 office 2007 安装 interops 2007。这就是为什么我仍然更倾向于 COM 方法,因为安装什么办公室并不重要。我也不想将函数粘贴到 mdb 中,因为我正在编写的程序仅用于连接和提取它需要的内容(无需任何用户交互) Access 2007 与 2003 MDB 兼容。 A2007 还与 A2002 和 A2000 MDB 兼容——它们都是 A2007 的原生文件格式。【参考方案2】:

如果是用于存储库,您可能需要查看 Visual SourceSafe 并获取 Access VSS 插件(链接为 Access 2003,未尝试其他版本)http://www.microsoft.com/downloads/details.aspx?familyid=2ea45ff4-a916-48c5-8f84-44b91fa774bc&displaylang=en

我猜 Access 插件会公开一个 COM 接口,如果你想走这条路,你可以相当干净地将源代码提取到你的 C# 应用程序中。正如罗伯特指出的那样,无论哪种情况,Office 都是必需的。

【讨论】:

我会警告你,VSS 是一个相当糟糕的源代码控制系统,但 Subversion 要好得多。如果您能够直接使用此插件提取源代码,我会非常感兴趣,但请告诉我,那会很酷。 感谢 Dale,是的,我们使用 svn,但不是为了那个。是否有任何插件用于转储代码的示例?【参考方案3】:

为了节省大量时间,你有什么理由不使用内置的记录器吗?

工具->分析->记录器

上面有能力生成一个报表,其中包含表单、报表、模块和类模块中的所有代码。此报告可以发送到 word 甚至保存为文本文件。

我只是为了节省您的时间和精力而提到这一点。此处无需编写任何代码。

更多注意事项: 我认为您无法在外部执行此操作。您可以将 ms-access 用作 com 对象,并使用 code 将代码作为文本提取出来,但您需要在该计算机上安装 access。

有两种方法,一种是使用 saveastext 命令。这会将任何表单、报告、代码等导出为文本文件(这是源代码插件都使用的)。

第二种方法是编写自动化代码。这是本机访问 (VBA) 中的代码,但您也可以使用任何支持 com 对象的语言编写此代码。代码如下所示:

  Dim db               As Database
  Dim Doc              As Document
  Dim mdl              As Module
  Dim lngCount         As Long
  Dim strForm          As String
  Dim strOneLine       As String
  Dim sPtr             As Integer

  Set db = CurrentDb()
  ' count module LOC

  For Each Doc In db.Containers("Modules").Documents
      DoCmd.OpenModule Doc.Name

      Set mdl = Modules(Doc.Name)

      lngCount = lngCount + mdl.CountOfLines
      For i = 1 To lngCount
         strOneLine = mdl.Lines(i, 1)
         Debug.Print strOneLine
      Next i

      Set mdl = Nothing
      DoCmd.Close acModule, Doc.Name

  Next Doc

上面的代码可以很容易地修改为搜索或导出文本。但是我认为使用 saveastext 的代码更少,但是你会得到表单定义等,这可能不是你想要的。

【讨论】:

感谢 Albert,这很酷。我想在外部进行并直接转储到文本文件 我在上面添加了一些代码+注释。您可以导出文本,但如果在外部执行此操作,您仍然必须将 access 用作 com 对象。【参考方案4】:

我是一个卑微的 Access 程序员,不能说我理解你的问题。

据我所知,要获得您想要的,您将不得不通过 COM 自动化访问 - 没有其他方法。执行此操作的例程与版本无关,并且将在至少 97 的所有 Access 版本中工作,只要您正在自动化的 Access 版本与您正在检查的文件前向兼容(即 A2000 将无法检查 ACCDB 并且可能(或可能不会)为 A2002、A2003 和 A2007 MDB 提供不可靠的结果。

关键是使用 Application.SaveAsText 来保存您的所有代码承载对象。这意味着您需要遍历所有模块、表单和报告,对于带有代码模块的模块,使用 SaveAsText 输出。对于表单和报告,如果您想跳过所有缺少模块的对象,您可能需要检查 HasModule 属性(尽管这仅在设计或表单视图中可用,即表单必须打开)。

如果您不关心 A97 兼容性,那就容易多了。您可以使用 CurrentProject.AllForms、CurrentProject.AllReports 和 CurrentProject.AllModules。如果您不关心在此阶段区分带有代码模块和没有代码模块的表单/报告,则无需打开它们来检查 HasModule 属性。相反,您可以查看生成的导出文本文件。如果没有模块,则输出文件中将缺少 CodeBehindForm 标签。

但是,表单有一个模块但没有实际代码是很常见的。这些模块将在 SaveAsText 输出中列出,如下所示:

  CodeBehindForm
  Attribute VB_GlobalNameSpace = False
  Attribute VB_Creatable = True
  Attribute VB_PredeclaredId = True
  Attribute VB_Exposed = False
  Option Compare Database
  Option Explicit

选项显式可能存在也可能不存在,并且选项比较数据库在技术上不是必需的,但在 Access 中创建的 99% 的模块将具有一个或两者(只有在 Access 2000 中创建的具有默认设置的数据库将缺少选项显式)。代码将在 4 个属性之后开始。如果只是两个 OPTION 语句,那么表单后面就没有真正的代码。

您应该能够在任何安装了与您要检查的所有 MDB/ACCDB 前向兼容的 Access 版本的 PC 上通过 vbScript 对 Access 进行 COM 自动化。

【讨论】:

以上是关于使用 C#/VBScript 获取 mdb 文件 (msaccess) 中的所有源代码的主要内容,如果未能解决你的问题,请参考以下文章

VBScript和Access MDB - 800A0E7A - “无法找到提供商。它可能没有正确安装“

MS access mdb 文件第一次从 Access 2007 打开时处于“修复”状态

C#插入MDB数据库获取最后插入ID

在服务器上触发 mdb 查询

从 Ms Access Mdb 文件获取数据到 sql server 2005 的最佳方法

获取用于创建 MDB 文件的 MSAccess 版本