DBA组件---ADO数据库编程利器
一、何谓DBA
DBA即Database Assistant,其实就是数据库编程助手。它是完全采用接口、OO理念用VB6.0编译的DLL COM组件。
它的好处在于使数据库的编程和维护都仅仅在表现层,便于数据库字段的反复增减,修改(客户需求无常),使代码更为规范,
也使得程序的总体代码减少,运行效率提高。
二、DBA的功能
DBA主要有四大特色功能:
1、自动生成对数据库中单个表的新增、更新SQL语句,并完成其操作
2、提供对外扩展的接口ifaceDbConnectionBuilder,可以实现对任何数据库的操作(只要ADO允许)
3、提供安全可靠、简单易用的用户、角色、权限访问体系
4、提供对字串的加密、解密,支持中文密码,加密长度可以是32位、64位、128位
三、DBA的使用
A〉配置INI文件
DBA与数据库的连接,依赖于INI文件的配置。要求在项目的当前路径下建立与执行文件同名,且节名也与执行文件同名的INI文件。
如:执行文件为myPrj.exe,则INI文件必须为myPrj.ini,且与myPrj.exe位于相同路径。使用默认连接时,INI文件中必须包含
以下节(以SQL Server配置为例):
'********* myPrj.ini *********
[myPrj]
SpecialIniFilePath=
ServerName=AppSrv
DatabaseName=AppDb
UserID=07AIQY6Vow5xph2075bjrz7uPX4WOG7767CKS08Tqy3vnf5013dlt19sRZ2UME67
UserPassword=066EMU2Zs91tld929E3fnv3yT80SKC67667GOW4Xu7zrjb49653hpx5wV6YQIA77
Timeout=100
如果是Access,则INI文件配置应如下示
'********* myPrj.ini *********
[myPrj]
SpecialIniFilePath=
DatabaseName=d:/db1.mdb
DatabasePassword=
SystemDatabase=
UserID=Admin
UserPassword=
Timeout=100
如果想自由配置节内容如下也行,此时你将不能使用默认方式打开数据库,而必须实现ifaceDbConnectionBuilder接口,
然后以指定方式打开数据库,详见C(2)所叙,这也是打开其它数据库的方法!
'********* myPrj.ini *********
[myPrj]
SpecialIniFilePath=
服务器=AppSrv
数据库=AppDb
用户=07AIQY6Vow5xph2075bjrz7uPX4WOG7767CKS08Tqy3vnf5013dlt19sRZ2UME67
密码=066EMU2Zs91tld929E3fnv3yT80SKC67667GOW4Xu7zrjb49653hpx5wV6YQIA77
超时=100
B〉DBA注册、引用
DBA是用VB6.0编写DLL COM组件,所以需先将DBA注册然后再引用到项目工程中(如是VB6项目则可直接引用,VB6会自动完成注册)
C〉DBA四大功能的使用
以下描述均以SQL Server为例,为此你需要建立最基本的数据库表,请在SQL查询分析器运行附件中的脚本CreateDbTable.sql,
下面就四大功能的使用,作简要的说明:
1、自动生成对数据库中单个表的新增、更新SQL语句,并完成其操作
现假定对数据库表sys_User实现新增、更新操作,界面控件从略,其规范代码如下
'代码是用自己写的代码生成器生成,你也自己写一个,编程就会变得轻松美妙。。。
- '初始化
- Private Sub IniFieldValue(dt As ifaceDbTable)
- dt.AddField "UserID", Character, "", 25
- dt.AddField "UserName", Character, "", 50
- dt.AddField "UserPwd", Character, "", 50
- dt.AddField "LastModifyDate", Character, "", 8
- End Sub
- '设定DbTable字段值
- Private Sub SetFieldValue(dt As ifaceDbTable)
- dt.AddField "UserID", Character, Me.txtUserID.Text, 25
- dt.AddField "UserName", Character, Me.txtUserName.Text, 50
- dt.AddField "UserPwd", Character, Me.txtUserPwd.Text, 50
- dt.AddField "LastModifyDate", Character, Me.txtLastModifyDate.Text, 8
- End Sub
- '获取DbTable字段值,并赋值给界面控件
- Private Sub GetFieldValue(dt As ifaceDbTable)
- Me.txtUserID.Text = dt.Fields("UserID").FieldValue
- Me.txtUserName.Text = dt.Fields("UserName").FieldValue
- Me.txtUserPwd.Text = dt.Fields("UserPwd").FieldValue
- Me.txtLastModifyDate.Text = dt.Fields("LastModifyDate").FieldValue
- End Sub
- '新增
- Private Sub btnInsertData_Click()
- Dim dt As Dim dt As ifaceDbTable
- Set dt = New clsDbTable
- dt.TableName = "sys_User"
- '请用主键字段名替换PrimaryKeyName
- dt.AddPrimaryKey "SysID", Anyinteger, 0, 4
- SetFieldValue dt
- Dim b As Boolean
- Dim dba As ifaceDBA
- Set dba = New clsDBA
- dba.OpenConnectionByDbType
- b = dba.InsertDataRow(dt)
- dba.Dispose
- Set dba = Nothing
- Set dt = Nothing
- End Sub
- '更新
- Private Sub btnUpdateData_Click()
- Dim dt As Dim dt As ifaceDbTable
- Set dt = New clsDbTable
- dt.TableName = "sys_User"
- '请用主键字段名替换PrimaryKeyName
- dt.AddPrimaryKey "SysID", Anyinteger, Me.txtSysID.Text, 4
- SetFieldValue dt
- Dim b As Boolean
- Dim dba As ifaceDBA
- Set dba = New clsDBA
- dba.OpenConnectionByDbType
- b = dba.UpdateDataRow(dt)
- dba.Dispose
- Set dba = Nothing
- Set dt = Nothing
- End Sub
- '删除
- Private Sub btnDeleteData_Click()
- Dim b As Boolean
- Dim sql As String
- Dim dba As ifaceDBA
- Set dba = New clsDBA
- dba.OpenConnectionByDbType
- sql = "delete from sys_User where SysID=333"
- b = dba.ExecSqlNonQuery(sql)
- dba.Dispose
- Set dba = Nothing
- End Sub
2、自己实现接口ifaceDbConnectionBuilder,操作任何数据库(只要ADO允许)
假定myPrj.exe要实现对Oracle数据库的操作,可以这样:
(a)设置myPrj.ini节内容如下
'********* myPrj.ini *********
[myPrj]
SpecialIniFilePath=
数据源=mySrv
用户=myName
用户密码=myPwd
超时=100
(b)创建一个新类,不妨命名为clsDbOracleConnString.cls,见下:
- '*************************************************************
- '文件 : clsDbOracleConnString.cls
- '类名 : clsDbOracleConnString
- '功能 : 实现接口ifaceDbConnectionString定义的方法
- '版本 : 1.0
- '*************************************************************
- Option Explicit
- Implements ifaceDbConnectionBuilder '继承接口
- '构造Oracle数据库连接字串
- Private Function ifaceDbConnectionBuilder_GetConnectionString(IniFile As ifaceIniFile) As String
- Dim conStr As String
- On Error GoTo err_exit
- conStr = "Provider=MSDAORA.1;Data Source=" & IniFile.Items("数据源").KeyValue & _
- ";User ID=" & IniFile.Items("用户").KeyValue & _
- ";Password=" & IniFile.Items("用户密码").KeyValue
- ifaceDbConnectionBuilder_GetConnectionString = conStr
- Exit Function
- err_exit:
- ifaceDbConnectionBuilder_GetConnectionString = ""
- End Function
上述代码并未对用户名和密码进行加密、解密,你可以使用DBA提供的加密、解密方法,也可以使用自己的加密、解密方法。
(c)使用如下代码即可对数据库进行操作
- Dim connStr As ifaceDbConnectionBuilder '定义为接口型
- Set connStr = New clsDbOracleConnString '创建时指向自己的实现类
- Dim dba As ifaceDBA
- Set dba = New clsDBA
- dba.OpenConnectionByBuilder connStr '注意这里的打开方式
- Dim sql as string
- sql = "select * from sys_User"
- Set MSHFlexGrid1.Recordset = dba.ExecSqlToRecordSet(sql)
- dba.Dispose
- Set dba = Nothing
- set connStr=Nothing
3、用户、角色、权限的访问
角色权限保存在数据库表Sys_RoleRight的RightID字段中,权限以字串按如下格式存贮 :000000000000000, 0-无效、1-有效
从左向右依次为:View、AddNew、Update、Delete、Query、Import、Export、Print、Preview、Submit、Upload、Download、Send、Accept、Reject
使用如下代码即可对用户角色的访问权限进行控制
- Dim dba As ifaceDBA
- Set dba = New clsDBA
- dba.OpenConnectionByDbType
- Dim usr As ifaceUracUsers
- Set usr = New clsUracUsers
- Set usr.ActiveDBA = dba
- usr.LoadUserRoles UserID '请用实际用户替换UserID
- usr.Roles.GetRight FormName '请用实际窗体名或类名替换FormName
- '权限控制
- btnQueryData.Enabled = usr.Roles.AllowView
- btnInsertData.Enabled = usr.Roles.AllowAddNew
- btnUpdateData.Enabled = usr.Roles.AllowUpdate
- btnDeleteData.Enabled = usr.Roles.AllowDelete
- '角色成员访问
- Dim i As Long
- For i = 1 To usr.Roles.Count
- Debug.Print usr.Roles.Items(i).RoleID & " ; " & usr.Roles.Items(i).RoleName
- Debug.Print
- Next i
- Set usr = Nothing
- dba.Dispose
- Set dba = Nothing
4、提字串的加密、解密,支持中文密码,加密长度可以是32位、64位、128位
使用如下代码即可对字符串进行加密、解密
- Dim cls As New clsSecurity
- Text1 = cls.EncryptString(Text1, Encrypt128) '128位加密
- Text1 = cls.DecryptString(Text1, Encrypt128) '128位解密
- Set cls = Nothing
四、DBA的补充说明
1、INI文件的接口、实现类见文《VB6.0接口,转转转 (用VB6.0接口实现INI文件的读取组件) 》
2、DBA中ifaceDbConnectionBuilder接口的Access、dBASE、SQL Server、Oracle的实现类见附件包,供扩展参考。
其中Oracle的实现类clsDbConnStrOracle.cls仅仅返回一个空串,要自己去重新实现。^_^
3、希望DBA使你的数据库编程变得轻松和愉悦。。。
4、附件请从这里下载http://download.csdn.net/source/835035