我想从Access数据库(表单,模块)获取所有源代码,而不使用Office interops。
我喜欢AllCodeToDesktop()
函数found here。但是,它从mdb文件内部运行。
加载mdb文件并在其上运行该函数的VBScript文件是什么?
答案 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向前兼容。