程序中访问有密码的Access数据库

本文介绍如何使用Microsoft Access对数据库文件进行加密,并通过BCB6编程环境实现对加密后的Access数据库的操作过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

以独占方式打开MDB数据库

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

打开有数据库密码的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后运行时没有这个对话框:

IDE中抛出的异常

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

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

找到登录密码

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值