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

时间:2009-09-16 04:01:23

标签: c# ms-access vba

我想从Access数据库(表单,模块)获取所有源代码,而不使用Office interops。

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

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

4 个答案:

答案 0 :(得分:4)

  

我想获得所有来源   访问数据库中的代码(表单,   模块) - 不使用办公室   互操作性展示

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

答案 1 :(得分:4)

如果是存储库,您可能需要查看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。

答案 2 :(得分:3)

为了节省大量时间,您有没有理由不使用内置的文档?

工具 - > analyze->文档管理

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

我只提到这个以节省你的时间和精力。这里不需要编写任何代码。

更多说明: 我不认为你能做到这一点。您可以使用ms-access作为com对象,并使用代码将代码作为文本提取出来,但您需要在该计算机上安装访问权限。

有两种方法,一种是使用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的代码较少,但是你得到了表单定义等等,这可能不是你想要的。

答案 3 :(得分:2)

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

据我所知,为了获得你想要的东西,你将不得不通过COM自动化Access - 没有别的办法。执行此操作的例程与版本无关,并且可以在至少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

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

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