Microsoft提供的Access桌面数据库是初学数据库编程的朋友用来上手的好选择。除了提供了容易上手的辅助设计界面、完善的数据类型之外,Access本身也提供了比较完备的数据库安全机制。

     Access本身是作为桌面数据库出现的,因此Access本身提供了基于文件级别的加密体系。加密方法是用“独占方式”打开需要加密的MDB文件,然后再选择“工具|安全|设置数据库密码”即可。

    一旦设置了数据库密码,那么在打开数据库时都会有一个窗口出现,提示你输入数据库密码。输入正确的密码后,就可以完全操作数据库了:

     随着应用的深入,很多用户开始用Access作为小型企业的数据库服务器,在企业级的应用中,简单的对数据库文件加密是不够的。企业应用的数据库需要对不同的用户(角色)授予不同的操作权限。例如,笔者编写过的一个InterBase的应用中,就至少要三个不同的角色:Operator(对数据库有插入权限),Supervisor(对数据库有更新、删除权限),Root(对数据库有所有的操作权限)。微软考虑到了这个情况,于是对Access数据库引入了系统数据库的概念。有关如何打开有系统数据库保护的Access数据库将在另一篇文章中讨论。本文将只讨论在程序中如何对Access数据库本身,也就是MDB文件加密的数据库进行操作的问题。

    启动BCB6后,新建项目,并在空白的窗体上放入一些控件(TADOConnection/TADOTable/TDataSource/TDBGrid/TButton)。完成后,窗体如下:

    在这个窗体中,我们在设置好相关的属性后,最关心的是ADOConnection的ConnectionString:

object ADOConnection1: TADOConnection
 ConnectionString = 
 'DBQ=e:/go4pro/00001/db1.mdb;Driver={Microsoft Access Driver (*.mdb)};password=123456;'
 LoginPrompt = False
 Left = 144
 Top = 8
 end

    这样的ConnectionString当然是不好的:它使用的是绝对路径。我将LoginPrompt也设置为False,因为有很多同好都提出过“如何在连接Access数据库时不弹出登录提示”的问题。我们在稍后会看到其实这么做是很容易的,但是却牺牲了安全性。

    在“Connect!”按钮的事件处理中,我们这样来书写:

void __fastcall TMainForm::ConnectBtnClick(Tobject *Sender)
 {
 ADOConnection1->Connected=false; String ConnStr;
 ConnStr="DBQ=";
 ConnStr=ConnStr+GetCurrentDir()+"//db1.mdb;password=123456;";
 ConnStr=ConnStr+"Driver={Microsoft Access Driver (*.mdb)}"; ADOConnection1->ConnectionString=ConnStr;
 ADOConnection1->Connected=true;
 ADOTable1->Active=true;
 }

    在这个事件处理过程中,我们用GetCurrentDir函数获得程序运行当前的目录,并用字符串操作人工构成了连接字符串。编译执行后,在IDE环境中会弹出一个异常,但是不影响程序正常运行,而且在脱离IDE后运行时没有这个对话框:

    我们可以注意到,在程序运行中,没有弹出登录对话框。因此,所谓的“如何在连接Access数据库时不弹出登录提示”的问题已经得以解决。

    但是,这个方法是不安全的。我们可以用一个支持HEX方式浏览文件的程序打开编译好的程序,很容易就可以搜索到登录密码:

    笔者强烈不推荐在程序中用明文方式保存密码的方式,因为这毫无安全性可言。实在需要在程序中保存密码时,至少应该加以最基本的加密手段。当然,我更赞成是用用户自己的登录对话框来输入用户名、密码进行登录。这将在后文进行更详细的阐述。