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

    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方式浏览文件的程序打开编译好的程序,很容易就可以搜索到登录密码:

找到登录密码

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 客户端可以通过用户名和密码访问数据库,这是因为在数据库为每个用户创建了相应的用户名和密码,并在客户端的程序使用这些凭据进行连接。然而,如果程序提示"access denied for user",这表示程序在尝试连接数据库时遇到了权限问题。 可能的原因有以下几种: 1. 用户名或密码错误:程序输入的用户名和密码数据库存储的不匹配,导致连接被拒绝。检查用户名和密码是否正确,并确保它们与数据库存储的凭据一致。 2. 权限不足:数据库用户的权限被限制,没有足够的权限访问指定的数据库。这种情况下,可以通过授予用户更高级别的权限来解决该问题,或者检查是否有其他的权限限制导致连接被拒绝。 3. 数据库连接设置错误:程序有可能连接数据库时,连接字符串或其他连接设置有误,导致连接被拒绝。检查程序数据库连接的设置,并确保它们与数据库配置相匹配。 为了解决这个问题,可以采取以下措施: 1. 检查用户名和密码:确保输入的用户名和密码数据库存储的凭据一致。如果不确定凭据是否正确,可以重置密码,然后使用新密码尝试连接。 2. 检查用户权限:检查数据库用户的权限设置,确保用户具有足够的访问权限。如果需要更高级别的权限,可以通过授权用户获得所需权限。 3. 检查数据库连接设置:确认程序连接数据库的设置是否正确。检查连接字符串、主机地址、端口号等连接参数,并与数据库的配置进行比对。 总之,提示"access denied for user"表示程序在连接数据库时遇到了权限问题,需要仔细检查用户名、密码、用户权限和数据库连接设置等因素,以解决该问题。 ### 回答2: 客户端在访问数据库时,通常需要提供用户名和密码进行身份验证。当遇到程序提示"access denied for user"错误时,意味着客户端提供的用户名和密码数据库存储的用户凭据不匹配,导致身份验证失败。 这种错误可能由以下原因引起: 1. 用户名或密码错误:首先要检查客户端提供的用户名和密码是否正确。可以尝试重新输入正确的凭据,确保大小写和拼写没有错误。 2. 用户不存在:如果输入的用户名在数据库不存在,那么访问将被拒绝。请仔细检查数据库的用户列表,确保提供的用户名是正确的。 3. 权限不足:某些情况下,即使用户名和密码正确,客户端也可能无权访问特定的数据库或表。数据库管理员需要授予适当的权限给相应的用户,以便他们能够访问所需的数据库。 4. IP限制:数据库服务器可能设置了IP访问限制,只允许特定IP地址的客户端访问。如果客户端的IP地址未被授权,访问将被拒绝。应与数据库管理员核对IP访问限制策略,确保客户端的IP地址已被允许。 解决这个问题的方法包括:确保提供正确的用户名和密码,确保用户存在并具有适当的权限,检查IP访问限制,并与数据库管理员协商解决。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值