作者: 江羽
Access因操作简便、直观,以及强大的功能,而得到许多数据库开发者的推崇,不过 Access 也有一定的局限性,如:Access开发平台开发的项目,无法完全编译并脱离Access系统环境;宏的安全级别限制有时让我们项目不能顺利启动,在分发项目时,需要我们手动对Access逐一手动设置等。
为弥补 Access 某些不尽如人意的地方,我尝试着用 VB与 Access 结合,用以自动完成Access系统环境设置,如:修改宏安全级别避开限制启动MDB项目,或指定工作组启动 MDB 项目等。
1.2配置要求:
-
本文ACCESS为2003版本(其它版本大家可自行测试);
-
壳通过VB6编译,编译后文件名:指定工作组并启动MDB项目.exe
1.3本文要点:
-
如何通过“安全机置向导”保护数据库;
-
如何实现VB与ACCESS无缝对接;
-
如何实现VB修改ACCESS宏安全级别限制;
-
如何实现用shell函数指定工作组启MDB项目
-
如何实现VB建立壳及如何编译EXE
二、使用Security Wizard设置Access数据库的安全性
我们通常会通过设置数据库密码、设置模块密码或将mdb文件转换为 mde 文件等方法来保护数据库的安全,以上方法能最大限度保护数据库的安全,但上述方法在网络的多人使用环境中有一定局限性,不能针对不同的用户,提供对于数据库对象不同的访问及管理权限。
解决方案就是建立“工作组”,那什么是“工作组”呢?通俗的说,“工作组”就是将用户按级别编成不同的“组”,并为不同组设定不同数据库访问及管理权限,并将这些设置存放在一个后缀为MDW的文件中,这个文件就是工作文件。只是建立工作组需一系列的操作,如果你不是很明了,会让你无所适从,为此Access为我们提供了友好的“设置安全机置向导”,让你轻松“一点”搞定。
2.1“安全机制向导”具体操作步骤:
1、打开数据库,点菜单 工具—安全—设置安全机制向导,打开向导。
2、在对话框中单下一步,其中一些默认选项不用做修改,直至下图这一步很关键(见下图),你可选择已有用户,并设定密码,你也可以添加新用户,并为添加用户设定密码,剩下就是点下一步直至最后完成就好
完成后,会在mdb文件所在文件夹产生另两个文件(见下图),后缀mdw 的文件为工作组文件,后缀bak 的文件为 mdb 备份文件。你必须记住,用户名:tan 密码:123,这可是我们后面指定工作组打开mdb关键。
三、VB建壳指定工作组启动MDB项目
3.1了解指定工作组启动MDB项目命令
下面是一段指定工作组启动MDB项目命令实例(见下图),你可以直接将以下命令粘贴到运行对话框运行。
"C:/Program Files/Microsoft Office/OFFICE11/msaccess.exe " "D:/例程/ADDRBOOK.mdb" /wrkgrp "D:/例程/Security.mdw" /user tan /pwd 123
- 应用程序路径:"C:/Program Files/Microsoft Office/OFFICE11/msaccess.exe "
- MDB文件路径:"D:/例程/Data/ADDRBOOK.mdb"
- 指定工作组参数:/wrkgrp
- 工作组文件路径:"D:/例程/Data/Security.mdw"
- 工作组用户参数:/user
- 工作组用户密码参数:/pwd
3.2指定工作组启动MDB需要解决的几个问题:
- 实现VB与ACCESS 的无缝对接。实现对接需要VB工程中引用ACCESS11.0 类库,文件名 MSACC.OLB ,引用方法:在VB工程窗口,点击菜单:工程—引用—钩选Micfrosoft ACCESS 11.0 Object library—点确定,完成类库引用。这样我们就能如在VBA编辑环境一样对ACCESS对象进行编程,调用ACCESS类对象属性、事件、方法。
实例代码:
'申明ACCESS对象类
Dim objAccessAsAccess.Application
'创建ACCESS实例对象
Set objAccess = CreateObject("ACCESS.Application")
'通过access对象属性,获得当前access版号
strVer = objAccess.Version
'退出ACCESS,并释放内存
objAccess.Quit
Set objAccess = Nothing
实例代码:
'*************************************************************************
' 函 数 名:SetRegLevel
'-------------------------------------------------------------------------
' 功能描述:修改ACCESS安全级别在注册表键值.
' 输 入:blnSetReg (Boolean) ,false为低,true为中
' 输 出:无
' 调用模块:RegWrite '写注册表操作自定义函数,用以修改安全级别键值
' 编 程:江羽
' 日 期:2008-10-09
'*************************************************************************
Public Function SetRegLevel(blnSetRegAs Boolean)
Dim strRegSec As String '字符串变量,安全设置键值所在注册表路径
Dim strVer As String '当前ACCESS版号字符串变量
On Error Resume Next
'创建ACCESS对象
Set objAccess = CreateObject("ACCESS.Application")
'获得当前office版号
strVer = objAccess.Version
'退出ACCESS,并释放内存
objAccess.Quit
Set objAccess = Nothing
'将注表路径赋值给变量
strRegSec = "HKEY_CURRENT_USER/Software/Microsoft/Office/" & _
strVer & "/access/Security/Level"
'RegWrite 自定义函数,用以写入键值操作
'键值1为低,2为中,3为高
If blnSetReg = False Then
RegWrite strRegSec,1
Else
RegWrite strRegSec,2
End If
End Function
- 指定工作组启动MDB项目自定义函数。这一节关键点在于用代码获取msaccess.exe 文件所在路径,换句话说就是必须得到office的安装路径。方法有二:一是SysCmd方法,二是通过注册表指定键值获取,本文采用的是第一种方法。以上二法代码实例,我在论坛中已有发贴,在此不做细说。下面是指定工作组启动MDB项目代码。
'*************************************************************************
' 函 数 名:OpenWmdAcc
'-------------------------------------------------------------------------
' 功能描述:用shell方法打开带安全工作组MD项目,必须提供工作组文件完整路径,
' 工作组用户名,密码.
' 输 入:strAccName(String) mdb项目文件名
' strMdwName(String) 工作组文件名
' strUserName(String) 工作组用户名
' strPassWord(string) 工作组密码
' 输 出:无
' 调用模块:
' 编 程:江羽
' 日 期:2008-10-09
'*************************************************************************
Public Function OpenWmdAcc(strAccName As String,strMdwName As String,strUserName As String,strPassWord As String)
Dim strAccPath As String 'Msaccess.exe 文件完整路径
Dim strAccFileName As String '要启动 mdb文件完整路径
Dim strMdwFileName As String '工作组文件及完整路径
Dim strAPP As String '命令表达式
On Error Resume Next
'创建ACCESS实例
Set objAccess = CreateObject("ACCESS.Application")
'获取MSACCESS.EXE完整路径
strAccPath = SysCmd(acSysCmdAccessDir) & "msaccess.exe "
'获取mdb项目完整路径
strAccFileName = App.Path & "/Data/" & strAccName
'获取工作组文件完整路径
strMdwFileName = App.Path & "/Data/" & strMdwName
'带工作组启动的命令行
strAPP = """" & strAccPath & """ """ & strAccFileName & """ /wrkgrp """ & _
strMdwFileName & """ /user " & strUserName & " /pwd " & strPassWord
Shell strAPP,3 '启动带工作组项目
objAccess.Quit '退出ACCESS
Set objAccess = Nothing '并释放内存
'如出现错误,给出错误提示
If Err <> 0 Then
MsgBox "系统出现:" & Err.Description & "错误! ",vbOKCancel + 32,"系统提示:"
End If
End Function
'*************************************************************************
' 过 程 名:OpenWmdMdb
'-------------------------------------------------------------------------
' 功能描述:首选修改宏安全级别限制,其次指定工作组打开mdb项目过程
' 输 入:blnSetReg (Boolean)
' 输 出:无
' 调用模块:SetRegLevel '写注册表操作自定义函数,用以修改安全级别键值
' OpenWmdAcc '指定工作组并启动mdb项目
' 编 程:江羽
' 日 期:2008-10-09
'*************************************************************************
Sub OpenWmdMdb()
'关闭宏安全级别限制
SetRegLevel False
'指定工作组启动mdb项目,用户名:tan,密码:123,是建立工作组时自己设定的
OpenWmdAcc "ADDRBOOK.mdb","Security.mdw","tan","123"
'开启中宏安全级别限制
SetRegLevel True
End Sub
3.3最终完成建壳,并编译为EXE
- 启动VB6,建一个标准EXE工程。
'*************************************************************************
' 过 程 名:Timer1_Timer
'-------------------------------------------------------------------------
' 功能描述:计时器控件,计时触发事件,用以延时关闭窗体
' 输 入:无
' 输 出:无
' 调用模块:OpenWmdMdb '
' 编 程:江羽
' 日 期:2008-10-09
'*************************************************************************
Private Sub Timer1_Timer()
Unload Me '关闭窗体
Call OpenWmdMdb '调用指定工作组启动mdb项目模块
End Sub
本文到此划上句号。特别申明由于本人技术有限,加之文字功力不济,不免有错漏或是表述不清的地方,还请大家斧正,更欢迎大家的相互交流。如果本文对于您有所帮助,那是我莫大的快慰。
本文实例可在office中国江羽博客下载,并附赠VB源码。
(全文结束)
Office中国.江羽
2008-10-11
Word版文稿下载:Word文本
实例及源码下载:VB实例及源码