Access开发培训
网站公告
·Access专家课堂QQ群号:151711184    ·Access快速开发平台下载地址及教程    ·欢迎加入Access专家课堂微信群!    ·如何快速搜索本站文章|示例|资料    
您的位置: 首页 > 技术文章 > 综合其它

Access养生保健秘笈之反编译大法

时 间:2019-06-10 23:17:03
作 者:红尘如烟   ID:10768  城市:成都
摘 要:本文讲解了如何解决使用Access开发的过程中,数据库文件的各种异常及损坏问题。
正 文:

望闻问切:了解并收集问题现象

大约是为了和 Office 其它组件统一,Access 有一个特色:它把所有对象和数据都放在同一个文件中。而不像其它开发工具,每个模块都是一个或多个文件。


因此当我们使用 Access 进行开发时,不可避免会对同一数据库文件进行反复修改。


但修改的次数一多,就会出现各种奇奇怪怪的问题。比如下面这些:



注意!这些只是我当前能收集到的一些具有代表性的问题,而不是前面所说的奇奇怪怪的问题的全部!


当遇到这些让你摸不着头的对话框时,实际上是 Access 在向你传达了一个不幸的消息:很遗憾,你的数据库文件出现了异常或损坏,Access 无法正常进行工作。




辨证施治:找出问题发生的原因和解决办法


Access 数据库出现问题,最简单的办法自然就是压缩修复了,但如果是出现前面所讲的问题,压缩修复基本不能解决问题。实际上仔细观察上面的错误信息,可以粗略得出一个规律:都和修改 VBA 代码有关。


实际上对于数据对象(主要是表)的损坏,压缩修复是很有用的手段。但对于作为客户端使用的数据库文件,绝大多数奇奇怪怪的问题都是由于编译状态异常造成的,而不少初学者写代码不够仔细 ,会有一个不太好的习惯:过度依赖编译功能来排错。而过于频繁地进行编译,就会造成编译异常不断积累(VBA的编译器比较烂的)。


那么有什么办法可以消除编译状态异常呢?这就要用到一个 Access 的命令行开关: 


/decompile


最常规的用法是,按 Win+R 组合键,打开运行对话框,然后输入以下包含 /decompile 开关的命令行并回车运行:

msaccess "D:\测试\Main.mdb" /decompile
     注意中间的文件路径名,要改成你实际的文件路径名。






疗效跟踪:为什么仍然不能修复已损坏的数据库文件?

实际上 Access 数据库文件的损坏,就和人生病一样,根据病症的的轻重程度不同,同样的治疗方法疗效也不一样。病情轻微时,可以很容易治好。而随着病情加重,就越来越难以治好了。到最后可能就变成了:癌症晚期,治不了,准备后事吧!



如果出现本文开头那些错误信息,说明文件损坏已经挺严重了!


所以,解决 Access 由于编译异常而造成的损坏,也和治病的思路一样:预防为主,治疗为辅。


但这里有一个问题,由于 Access 的单文件特性,在出现明显的错误之前,我们不知道是否存在编译异常及文件损坏;即使出现了明显的错误,有时候往往也无法判断究竟是哪个或哪几个对象的有问题。正如很多癌症早期没有任何症状,很难发现,当发现明显症状时已经是晚期了。


因此,最正确的用法是:不能把反编译当成一个出现问题之后的治疗手段,而是当成一个日常养生保健手段。


当然事无绝对,在 Access 中,我们也不是完全没有半点检查手段。这里有一个检测窗体(或其它对象)是否损坏的方法


一般来说,越复杂的对象,越容易出问题。因此在 Access 中,最容易损坏的多半是比较复杂的窗体。


我们可以先用 SaveAsText 方法将窗体另存为文本文件,再用 LoadFromText 方法将文件文件加载为窗体(自动替换已有窗体)。这2个步骤任何一个无法完成,就说明这个窗体有异常或损坏。


当然这个操作要一个一个窗体进行处理,就很繁琐,最好是要自己写一个循环代码来处理。


如果你使用盟威软件快速开发平台,那么可以打开 SysFrm_DevTool_ObjectRepair 窗体,这个是现成工具的,并且是开源的,直接使用即可。






优化改进:怎么简单方便地使用反编译命令行?

现在我们知道反编译命令的好处,也知道了应该经常性地使用它。但每次都要打开“运行”对话框,然后输入命令行,再回车打开文件,感觉好麻烦啊!怎么办?


这里本公子教大家一个进行反编译最简单方法使用VBS脚本来执行命令行。(呃,这个会不会违反了广告法……P_P)


假设数据库文件名是 Main.mdb,新建一个文本文件,然后将其重命名为“反编译打开Main.vbs”,右键点击然后在快捷菜单中选择“编辑”菜单项,用记事本打开它,打开后输入以下代码:

strName = "Main.mdb"
strPath = CreateObject("Scripting.FileSystemObject").GetFolder(".").Path & "\"
CreateObject("WScript.Shell").Run "MSACCESS """ & strPath & strName & """ /decompile"








然后我们每次打开 Main.mdb 的时候,不再直接双击Main.mdb 来打开,而是改为双击这个“反编译打开Main.vbs”的脚本文件来打开。

这样没有增加任何额外操作!是不是方便多了?





注意事项:只是为了提醒你们不要马虎

1. 脚本中使用了相对路径,因此 vbs 脚本文件必须和 Access 数据库文件放在同一文件夹中。


2. 脚本中第1行代码指定的文件名,必须和要打开的数据库文件名相同。






复盘总结:前事不忘,后事之师。


解决 Access 的各种异常及损坏,其实无非就是三板斧,别无它法:


1. 反编译

2. 压缩修复

3. 导出所有对象到空的新建数据库文件中


但这些就像是武术中的基本招式,运用之妙,存乎一心!水平的体现,就是看你能不能把基本招式玩出花来。


反编译主要用于解决非数据异常损坏问题。

压缩修复主要用于解决数据异常损坏,当然非数据问题最好也压缩修复一下。

如果用了前面两招,仍然有问题,那么就用导出所有对象到空的新建数据库文件中这一招。


少年,这本《懒得取名》神功中的秘传心法本公子已经传授给你了,能领悟多少,就看你的缘法了!学费十文钱,谢谢惠顾!


(喂喂喂!什么叫《懒得取名》?!叫个《九阴真经疗伤篇》之类有逼格的名字不行么!)


(哎呀!五毛特效都用不起的穷逼剧组,就不要在意那些细节了!)


最后的最后,再次强调一句:多备份!多备份!多备份!




Access软件网QQ交流群 (群号:54525238)       Access源码网店

常见问答:

技术分类:

相关资源:

专栏作家

关于我们 | 服务条款 | 在线投稿 | 友情链接 | 网站统计 | 网站帮助