: 问题的提出
在Visual Basic中常用的数据访问接口有下列三种数据库访问对象(DAOData Access Object)远程数据库对象(RDORemote Data Object)和ActiveX数据对象(ADOActiveX Data Object )数据库访问技术一直在不断进步而这三种接口的每一种都分别代表了该技术的不同发展阶段最新的是ADO它是比RDO和DAO更加简单然而更加灵活的对象模型正因如此越来越多的人在用VB开发数据库软件时使用ADO作为数据访问接口在开发过程中我们通常的使用的方法是先使用数据库管理系统(例如Microsoft Access)或VB中的可视化数据管理器建立好数据库和数据表结构然后在程序中通过使用ADODC数据库控件或引用ADO对象与数据库中的表建立连接再通过数据库感知控件(例如文本框DataGrid等)来进行数据库的各种操作在这种开发过程中我们有时需要面对这样一个问题如何让用户在程序运行过程中动态地建立自己所需的数据库和数据表以提高程序的灵活性呢?在程序运行过程中建立自己所需的数据库和数据表其本质就是用代码(或者说通过编程)来建立数据库和数据表众所周知在Foxpro或ASP编程中这是很容易的一件事件那么在VB数据库编程中又是怎样来操作的呢?在VB数据库编程中如果使用DAO作为数据库访问接口技术则可以用CreateDatabase结合CreateTableDef方法来实现目前已有不少书和杂志都讲到了这种方法本文就不再讲述了但你如果使用的是最新的数据库访问接口技术ADO你却发现目前的书和杂志上没有文章讲到如何用代码来建立数据库和数据表的方法可有时我们非常需要用到这种方法下面我们就来解决这个问题
: ADO与ADOX
我们先来对ADO 和ADOX进行简单的认识在VB中使用ADO开发数据库应用程序时我们要引用对象库Microsoft ActiveX Data Objects Library 这个东西的简称就是ADO它是VB数据库最核心的对象群也是VB数据库开发人员经常所引用的对象库在VB中你可以看到它的各种版本从版到版都有很多人对它已经很熟悉在此我们不再详细介绍如果要在程序运行过程中创建数据库和表我们还要引用对象库Microsoft ADO Ext For DDL Security简称为ADOX其库文件名为是MsadoxdllADOX是对 ADO 对象和编程模型的扩展它将 ADO 扩展为包括创建修改和删除模式对象如表格和过程它还包括安全对象用于维护用户和组以及授予和撤消对象的权限ADOX的对象如下表所示
对象 说明
Catalog 包含描述数据源模式目录的集合
Column 表示表索引或关键字的列
Group 表示在安全数据库内有访问权限的组帐号
Index 表示数据库表中的索引
Key 表示数据库表中的主关键字外部关键字或唯一关键字
Procedure 表示存储的过程
Table 表示数据库表包括列索引和关键字
User 表示在安全数据库内具有访问权限的用户帐号
View 表示记录或虚拟表的过滤集
ADOX常用方法有Append(包括ColumnsGroupsIndexesKeysProceduresTablesUsersViews)Create(创建新的目录)Delete(删除集合中的对象)Refresh(更新集合中的对象)等等有关 ADOX 的详细信息请在 中参阅 Microsoft 发布的有关 ADOX说明的 Web 页
: 在原有数据表的基础上产生新的数据表
如果仅仅是在已有的数据表的基础上产生新的数据表我们只要引用对象库Microsoft ActiveX Data Objects Library再利用Select…Into语句就可以了例如有一个名为Wagemdb的数据库数据库中有一个名为工资表数据表该数据表的字段有编号姓名基本工资津贴应发工资扣款实发工资等这个表中已经有很多的记录现在我们把其中的实发工资大于的记录筛选出来组成一个新表新表的名称由用户从文本框中输入新表中我们只要三个字段它们是编号姓名实发工资我们用下列程序就可以实现
(事先在窗体中添加一个文本框Text和一个命令按钮Command)
Dim conn As New ADODBConnection
Dim rs As New ADODBRecordset
Dim command As New mand
Private Sub Command_Click()
Dim bm As String
Dim sql As String
If TextText <> Then
bm = Trim(TextText)
sql= Select 编号姓名实发工资 Into + bm + From 工资表 Where 实发工资>
Set commandActiveConnection = conn
commandCommandText = sql
commandExecute
Else
MsgBox 你必须输入一个名字
End If
Private Sub Form_Load()
Dim str As String
str = AppPath
If Right(str ) <>\ Then
str = str + \
End If
pstr = Provider=MicrosoftJetOLEDB;
pstr = pstr & Persist Security Info=False;
pstr = pstr & Data Source= & str & wagemdb
connOpen pstr
rsCursorLocation = adUseClient
rsOpen 工资表 conn adOpenKeyset adLockPessimistic
Set DataGridDataSource = rs
End Sub
当然我们还可以把程序设计得更好比如让用户先在窗口中任意选择所需的字段和一些条件然后再组合生成一个新表但无论如何这种操作只能在从原表的基础上产生一个新表不能产生一个数据库文件并且新表和原表放在同一个数据库中
: 建立新的数据库和表
前面讲到的方法有一定的局限性它不能让用户产生自己所需的数据库文件即使能产生数据表也只能在原有表的基础上生成我们现在的目的就是让用户利用ADO对象在程序运行过程中创建数据库和表就好象他利用Access来建立数据库和表一样为此我们应该引用对象库Microsoft ActiveX Data Objects Library和Microsoft ADO Ext For DDL Security
我们不妨用一个实例来说明具体的操作过程和方法我们的实例要达到目的是在程序运行过程中建立一个数据库数据库的名称由用户输入然后在数据库中建立一个名为MyTable的数据表数据表中有三个字段它们分别是编号(整数型) 姓名(字符型宽度为)住址 (字符型宽度为)接着在数据表中添加一条记录最后在DataGrid控件中把记录的内容显示出来并且让用户在DataGrid控件中任意修改添加记录
首先在VB中新建一个窗体然后在工程菜单中引用对象库Microsoft ActiveX Data Objects Library和Microsoft ADO Ext For DDL Security接着定义三个窗体级的对象变量和一个窗体级的字符串变量它们的具体定义是
Dim cat As New ADOXCatalog 不用cat用另外一个名字也可以
Dim conn As New ADODBConnection
Dim rs As New ADODBRecordset
Dim pstr As String 定义该变量是为了后面的书写方便
为了更灵活地创建数据库我们可以在窗体中加入一个通用对话框一个DataGrid控件三个命令按钮它们的标题分别是创建数据库和表查看更新通用对话框的作用是给用户输入数据库文件名和决定数据库的存放位置 创建数据库和表命令按钮对应的代码是
Private Sub Command_Click()
Dim fm As String fm变量用来获取用户输入的文件名
CommonDialogFilter = MDB文件(*mdb)|*mdb|AllFiles(**)|**|
CommonDialogFilterIndex =
CommonDialogInitDir = D:\Jthpaper
CommonDialogFlags =
CommonDialogAction =
If CommonDialogFileName = Then
MsgBox 你必须输入一个文件名请重新保存一次!
Exit Sub
Else
fm = CommonDialogFileName
End If
pstr = Provider=MicrosoftJetOLEDB; 不能把这里的改为
pstr = pstr & Data Source= & fm
catCreate pstr 创建数据库
Dim tbl As New Table
catActiveConnection = pstr
tblName = MyTable 表的名称
tblColumnsAppend 编号 adInteger 表的第一个字段
tblColumnsAppend 姓名 adVarWChar 表的第二个字段
tblColumnsAppend 住址 adVarWChar 表的第三个字段
catTablesAppend tbl 建立数据表
connOpen pstr
rsCursorLocation = adUseClient
rsOpen MyTable conn adOpenKeyset adLockPessimistic
rsAddNew 往表中添加新记录
rsFields()Value =
rsFields()Value = 孙悟空
rsFields()Value = 广州市花果山
rsUpdate
End Sub
上面程序中有一个需要说明的地方这就是语句pstr = Provider=MicrosoftJetOLEDB;这个语句表示Microsoft Jet OLEDB驱动程序的版本是这是目前最新的版本利用它你可以用VB中的ADO对象访问Access及其以下版本所建立的数据库你不能把这里的改为否则程序不能正常运行在VB中版本的Microsoft Jet OLEDB驱动程序对应的是Access数据库换而言之用这种方法建立的数据库和表跟用Access所建立的数据库和表是同一类型的你只能直接用Access来打开虽然你可以用VB来访问这种数据库和其中的数据表但你不能用Access或VB中的可视化数据管理器来直接打开
在程序运行时只要用户单击该命令按钮就可以创建自己所需的数据库查看命令按钮对应的代码是
Private Sub Command_Click()
Set DataGridDataSource = rs
End Sub
更新命令按钮对应的代码是
Private Sub Command_Click()
rsUpdateBatch
End Sub
我们这个实例只是用来说明问题在实际应用当中你可以把它进一步改进例如你在窗体中再增加一些文本框和组合框供用户输入或选择数据表的名称字段的名称字段的宽度和小数位数这样用户就可以自主地决定数据库的所有内容了程序的灵活性也就大大提高了
: 结束语
如果你使用的是最新的数据访问接口技术ADO(Microsoft强烈建议大家使用这种最新技术)你又想在程序运行过程中创建数据库文件和数据表此时你应该在Visual Basic 中引用对象库Microsoft ActiveX Data Objects Library和Microsoft ADO Ext For DDL Security然后使用ADOX对象的CreateAppend等方法就可以实现 这种方法使用的Microsoft Jet OLEDB驱动程序的版本是因此使用这种方法建立的数据库文件和数据表可以直接使用Access打开笔者在VB数据库软件开发过程中已多次使用这种方法该方法在提高程序的灵活性和满足用户的特殊需要方面有很大的作用