2023年11月23日发(作者:)

1:问题的提出

VisualBasic中,常用的数据访问接口有下列三种:数据库访问对象

(DAO,DataAccessObject)、远程数据库对象(RDO,RemoteDataObject)和

ActiveX数据对象(ADO,ActiveXDataObject)。数据库访问技术一直在不断

进步,而这三种接口的每一种都分别代表了该技术的不同发展阶段。最新的是

ADO,它是比RDODAO更加简单,然而更加灵活的对象模型。正因如此,越来

越多的人在用VB开发数据库软件时使用ADO作为数据访问接口。在开发过程中,

我们通常的使用的方法是:先使用数据库管理系统(例如:MicrosoftAccess)

VB中的可视化数据管理器建立好数据库和数据表结构,然后在程序中通过使

ADODC数据库控件或引用ADO对象与数据库中的表建立连接,再通过数据库

感知控件(例如:文本框、DataGrid等)来进行数据库的各种操作。在这种开发

过程中,我们有时需要面对这样一个问题:如何让用户在程序运行过程中动态

地建立自己所需的数据库和数据表以提高程序的灵活性呢?在程序运行过程中

建立自己所需的数据库和数据表,其本质就是用代码(或者说通过编程)来建立

数据库和数据表。众所周知,FoxproASP编程中,这是很容易的一件事件。

那么在VB数据库编程中又是怎样来操作的呢?在VB数据库编程中,如果使用

DAO作为数据库访问接口技术,则可以用CreateDatabase结合CreateTableDef

方法来实现,目前已有不少书和杂志都讲到了这种方法,本文就不再讲述了;

但你如果使用的是最新的数据库访问接口技术ADO,你却发现目前的书和杂志

上没有文章讲到如何用代码来建立数据库和数据表的方法,可有时我们非常需

要用到这种方法,下面我们就来解决这个问题。

2:ADOADOX

我们先来对ADOADOX进行简单的认识。在VB6中,使用ADO开发数据

库应用程序时,我们要引用对象库"MicrosoftActiveXDataObjects2.5

Library",这个东西的简称就是ADO,它是VB6数据库最核心的对象群,也是

VB数据库开发人员经常所引用的对象库,在VB6中你可以看到它的各种版本,

2.0版到2.6版都有,很多人对它已经很熟悉,在此我们不再详细介绍。如

果要在程序运行过程中创建数据库和表,我们还要引用对象库"MicrosoftADO

Ext2.1.ForDDLSecurity",简称为ADOX,其库文件名为是:。

ADOX是对ADO对象和编程模型的扩展,它将ADO扩展为包括创建、修改和删

除模式对象,如表格和过程。它还包括安全对象,用于维护用户和组,以及授

予和撤消对象的权限。ADOX的对象如下表所示:

对象说明

Catalog包含描述数据源模式目录的集合。

Column表示表、索引或关键字的列。

Group表示在安全数据库内有访问权限的组帐号。

Index表示数据库表中的索引。

Key表示数据库表中的主关键字、外部关键字或唯一关键字。

Procedure表示存储的过程。

Table表示数据库表,包括列、索引和关键字。

User表示在安全数据库内具有访问权限的用户帐号。

View表示记录或虚拟表的过滤集。

ADOX常用方法有:Append(包括Columns、Groups、Indexes、Keys、

Procedures、Tables、Users、Views)、Create(创建新的目录)、Delete(删除

集合中的对象)、Refresh(更新集合中的对象)等等。有关ADOX的详细信息,

请在/data/ado中参阅Microsoft发布的有关

ADOX说明的Web页。

3:在原有数据表的基础上产生新的数据表

如果仅仅是在已有的数据表的基础上产生新的数据表,我们只要引用对象

库"MicrosoftActiveXDataObjects2.5Library"再利用Select…Into语句

就可以了。例如:有一个名为的数据库,数据库中有一个名为"工资

表"数据表,该数据表的字段有:编号、姓名、基本工资、津贴、应发工资、扣

款、实发工资等,这个表中已经有很多的记录。现在我们把其中的实发工资大

2000的记录筛选出来组成一个新表,新表的名称由用户从文本框中输入,

表中我们只要三个字段,它们是:编号、姓名、实发工资。我们用下列程序就

可以实现:

(事先在窗体中添加一个文本框Text1和一个命令按钮Command1)

DimconnAsNewtion

DimrsAsNewset

DimcommandAsNewd

PrivateSubCommand1_Click()

DimbmAsString

DimsqlAsString

If<>""Then

bm=Trim()

sql="Select编号,姓名,实发工资Into"+bm+"From工资表Where

实发工资>2000"

SetConnection=conn

dText=sql

e

Else

MsgBox"你必须输入一个名字"

EndIf

PrivateSubForm_Load()

DimstrAsString

str=

IfRight(str,1)<>""Then

str=str+""

EndIf

pstr="Provider=.3.51;"

pstr=pstr&"PersistSecurityInfo=False;"

pstr=pstr&"DataSource="&str&""

pstr

Location=adUseClient

"工资表",conn,adOpenKeyset,adLockPessimistic

Seturce=rs

EndSub

当然,我们还可以把程序设计得更好,比如:让用户先在窗口中任意选择

所需的字段和一些条件,然后再组合生成一个新表。但无论如何,这种操作只

能在从原表的基础上产生一个新表,不能产生一个数据库文件,并且新表和原

表放在同一个数据库中。

4:建立新的数据库和表

前面讲到的方法有一定的局限性,它不能让用户产生自己所需的数据库文

件,即使能产生数据表也只能在原有表的基础上生成。我们现在的目的就是让

用户利用ADO对象在程序运行过程中创建数据库和表,就好象他利用Access

建立数据库和表一样。为此,我们应该引用对象库"MicrosoftActiveXData

Objects2.5Library"和"MicrosoftADOExt2.1.ForDDLSecurity"

我们不妨用一个实例来说明具体的操作过程和方法。我们的实例要达到目

的是:在程序运行过程中建立一个数据库,数据库的名称由用户输入。然后在

数据库中建立一个名为"MyTable"的数据表,数据表中有三个字段,它们分别是:

"编号"(整数型)、"姓名"(字符型,宽度为8)、"住址"(字符型,宽度为50),

接着在数据表中添加一条记录,最后在DataGrid控件中把记录的内容显示出

来,并且让用户在DataGrid控件中任意修改、添加记录。

首先在VB中新建一个窗体,然后在"工程"菜单中引用对象库"Microsoft

ActiveXDataObjects2.5Library"和"MicrosoftADOExt2.1.ForDDL

Security"。接着定义三个窗体级的对象变量和一个窗体级的字符串变量,它们

的具体定义是:

DimcatAsNewg'不用cat用另外一个名字也可以

DimconnAsNewtion

DimrsAsNewset

DimpstrAsString'定义该变量是为了后面的书写方便

为了更灵活地创建数据库,我们可以在窗体中加入一个通用对话框、一个

DataGrid控件,三个命令按钮,它们的标题分别是:创建数据库和表、查看、

更新。通用对话框的作用是给用户输入数据库文件名和决定数据库的存放位置。

"创建数据库和表"命令按钮对应的代码是:

PrivateSubCommand1_Click()

DimfmAsString'fm变量用来获取用户输入的文件名

="MDB文件(*.mdb)|*.mdb|AllFiles(*.*)|*.*|"

Index=1

r="D:Jthpaper"

=6

=2

Ifme=""Then

MsgBox"你必须输入一个文件名,请重新保存一次!"

ExitSub

Else

fm=me

EndIf

pstr="Provider=.4.0;"'不能把这里的4.0改为3.51

pstr=pstr&"DataSource="&fm

pstr'创建数据库

DimtblAsNewTable

Connection=pstr

="MyTable"'表的名称

"编号",adInteger'表的第一个字段

"姓名",adVarWChar,8'表的第二个字段

"住址",adVarWChar,50'表的第三个字段

tbl'建立数据表

pstr

Location=adUseClient

"MyTable",conn,adOpenKeyset,adLockPessimistic

'往表中添加新记录

(0).Value=9801

(1).Value="孙悟空"

(2).Value="广州市花果山"

EndSub

上面程序中有一个需要说明的地方,这就是语句:pstr=

"Provider=.4.0;",这个语句表示MicrosoftJetOLEDB

动程序的版本是4.0,这是目前最新的版本,利用它你可以用VB中的ADO

象访问Access2000及其以下版本所建立的数据库。你不能把这里的"4.0"改为

"3.51"否则程序不能正常运行;VB6中,3.51版本的MicrosoftJetOLEDB

驱动程序对应的是Access97数据库。换而言之,用这种方法建立的数据库和

表跟用Access2000所建立的数据库和表是同一类型的,你只能直接用

Access2000来打开,虽然你可以用VB6来访问这种数据库和其中的数据表,

但你不能用Access97VB6中的"可视化数据管理器"来直接打开。

在程序运行时只要用户单击该命令按钮就可以创建自己所需的数据库。"

"命令按钮对应的代码是:

PrivateSubCommand3_Click()

Seturce=rs

EndSub

"更新"命令按钮对应的代码是:

PrivateSubCommand4_Click()

Batch

EndSub

我们这个实例只是用来说明问题,在实际应用当中你可以把它进一步改进,

例如:你在窗体中再增加一些文本框和组合框,供用户输入或选择数据表的名

称、字段的名称、字段的宽度和小数位数。这样,用户就可以自主地决定数据

库的所有内容了,程序的灵活性也就大大提高了。

5:结束语

如果你使用的是最新的数据访问接口技术ADO(Microsoft强烈建议大家使

用这种最新技术),你又想在程序运行过程中创建数据库文件和数据表,此时,

你应该在VisualBasic6.0中引用对象库"MicrosoftActiveXDataObjects2.5

Library""MicrosoftADOExt2.1.ForDDLSecurity"然后使用ADOX对象的

CreateAppend等方法就可以实现。这种方法使用的MicrosoftJetOLEDB

驱动程序的版本是4.0因此,使用这种方法建立的数据库文件和数据表可以直

接使用Access2000打开。笔者在VB数据库软件开发过程中已多次使用这种

方法,该方法在提高程序的灵活性和满足用户的特殊需要方面有很大的作用。

使用ADO编程模型需添加ADO对象类库的“引用”----“MicrosoftActiveXDataObjects

2.xLibrary”

ADOVB数据库操作主要包括读、写、修改及删除等操作,不论是进行什么数据库操作都

必须首先连接到数据库。

一、连接到数据库

1、连接到SQL数据库:

通过ADOConnection对象可实现VBSQL数据库的连接。一般方法如下:

DimcnnAsNewtion‘创建Connection对象cnn,关键字new用于创建

新对象

tionString="Provider=SQLOLEDB.1;Password=密码;UserID=用户名;Initial

Catalog=SQL数据库文件;DataSource=localhost;"'指定提供者,

设置数据源

‘打开到数据库的连接

……..

cnn.Close‘关闭到数据库的连接

或者:

DimcnnAsNewtion‘创建Connection对象cnn,关键字new用于创建

新对象

"Provider=SQLOLEDB.1;Password=密码;UserID=用户名;Initial

localhost;"‘打开到数据库的连接

……..

cnn.Close‘关闭到数据库的连接

Catalog=SQL数据库文件;DataSource=

2、连接到ACCESS数据库:

通过ADOConnection对象可实现VBACCESS数据库的连接。一般方法如下:

DimcnnAsNewtion‘创建Connection对象cnn,关键字new用于创建

新对象

tionString="Provider=.4.0;DataSource=ACCESS数据

库文件.MDB"'指定提供者,设置数据源

‘打开到数据库的连接

……..

cnn.Close‘关闭到数据库的连接

或者:

DimcnnAsNewtion‘创建Connection对象cnn,关键字new用于创建

新对象

"Provider=.4.0;DataSource=ACCESS数据库文

件.MDB"‘打开到数据库的连接

……..

cnn.Close‘关闭到数据库的连接

二、读数据库操作

读数据库操作一般可通过recordset对象实现。方法如下—以ACCESS数据库为例:

DimcnnAsNewtion‘创建Connection对象cnn,关键字new用于创建

新对象

"Provider=.4.0;DataSource=ACCESS数据库文

件.MDB"‘打开到数据库的连接

DimrsAsNewRecordset'声明一个记录集对象

rs.Open[记录源,cnn,游标类型,锁定类型,命令类型]‘也可先设置记录集

相关属性

=rs("字段名称1或索引")‘假设读取出来的字段信息显示

在文本框中,三种读取方法等价

=("字段名称2或索引")

=rs!字段名称3

…….

‘关闭记录集对象

cnn.Close‘关闭与数据库的连接

setrs=Nothing‘释放rs对象实例

setcnn=Nothing‘释放Connection对象实例

l记录源一般为一条SQL查询语句,以实现查询目的。

lRecordset对象还保持查询返回的记录的位置,它返回第一个检索到的记

录,并允许你一次一项逐步扫描其他结果。Recordset对象的部分属性及方法如下

Rs(i):i个字段的数据,i0开始

Rs(字段名):取指定字段的数据

Rs.EOF:记录指针指到记录的尾部

Rs.BOF:记录指针指到记录的头部

Rs.RecordCount:游标中的数据记录总数

Rs.PageSize当对象设有分页时,用于指定逻辑页中的记录个数

Rs.PageCount返回记录集中的逻辑分页数

Rs.MoveNext:将记录指针移到下一个记录

Rs.MovePrev:将记录指针移到上一个记录

Rs.MoveFirst:将记录指针移到第一个记录

Rs.MoveLast:将记录指针移到最后一个记录

:将当前记录删除

:添加一条新记录(行)

l如果要读取满足条件的数据库记录,只要在SELECT语句中增加WHERE子句

即可(例如:WHERE性别=”男”),如果要读取多条满足条件的数据库记录,可通过循环

语句来实现,并且每读取一条记录后使用Rs.MoveNext移动记录指针以读取下一条记录。

三、写数据库操作

库为例:

方法1:使用recordset对象(此方法一般初学者使用较多)。方法如下—以ACCESS数据

DimcnnAsNewtion‘创建Connection对象cnn,关键字new用于创建

新对象

"Provider=.4.0;DataSource=ACCESS数据库文

件.MDB"‘打开到数据库的连接

DimrsAsNewRecordset'声明一个记录集对象

‘也可先设置记录集rs.Open[记录源,cnn,游标类型,锁定类型,命令类型]

相关属性

‘告诉rs我们要添加一行

法等价

rs("字段名称1或索引")=值1‘给要添加的行的一个字段赋值,三种方

("字段名称2或索引")=值2

rs!字段名称3=值3

…….

‘通知rs我们要把

这个行写入数据库

‘关闭记录集对象

cnn.Close‘关闭与数据库的连接

setrs=Nothing‘释放rs对象实例

setcnn=Nothing‘释放Connection对象实例

laddnew使用方法后,如果要放弃添加的结果,应调用记录集的

CancelUpdate方法放弃。

方法2:使用Connection对象的Execute方法对表进行SQL记录插入操作(要求要熟悉SQL

命令)

DimcnnAsNewtion‘创建Connection对象cnn,关键字new用于创建

新对象

"Provider=.4.0;DataSource=ACCESS数据库文

件.MDB"‘打开到数据库的连接

2…..)‘拼写Insert插入语句

添加

…….

cnn.Close‘关闭与数据库的连接

‘释放Connection对象实例setcnn=Nothing

'执行Insert语句实现estrSQL

Values(值1,strSQL="InsertInto数据表(字段1,字段2…..)

四、修改数据库操作

方法1:使用recordset对象(此方法一般初学者使用较多)。方法如下—以ACCESS数据

库为例:

DimcnnAsNewtion‘创建Connection对象cnn,关键字new用于创建

新对象

"Provider=.4.0;DataSource=ACCESS数据库文

件.MDB"‘打开到数据库的连接

DimrsAsNewRecordset'声明一个记录集对象

‘也可先设置记录集rs.Open[记录源,cnn,游标类型,锁定类型,命令类型]

相关属性

…….

rs("字段名称1或索引")=新值1‘‘给要修改的行的一个字段赋一个新

值,三种方法等价

("字段名称2或索引")=新值2

rs!字段名称3=新值3

…….

‘通知rs,我们要

把修改好的记录行写入数据库

‘关闭记录集对象

cnn.Close‘关闭与数据库的连接

setrs=Nothing‘释放rs对象实例

setcnn=Nothing‘释放Connection对象实例

l如果放弃修改结果,应调用记录集的CancelUpdate方法放弃更新数据

库。

方法2:使用Connection对象的Execute方法对表进行SQL记录更新操作(要求要熟悉SQL

命令)

DimcnnAsNewtion‘创建Connection对象cnn,关键字new用于创建

新对象

"Provider=.4.0;DataSource=ACCESS数据库文

件.MDB"‘打开到数据库的连接

Update语句,以便进行修改

estrSQL'执行Insert语句实现

添加

…….

cnn.Close‘关闭与数据库的连接

‘释放Connection对象实例setcnn=Nothing

‘拼写strSQL="Update数据表Set字段1=新值1,字段2=新值2…..

五、删除数据库操作

方法1:使用recordset对象(此方法一般初学者使用较多)。方法如下—以ACCESS数据

库为例方法1:通过

DimcnnAsNewtion‘创建Connection对象cnn,关键字new用于创建

新对象

"Provider=.4.0;DataSource=ACCESS数据库文

件.MDB"‘打开到数据库的连接

DimrsAsNewRecordset'声明一个记录集对象

rs.Open‘也可先设置记录集[记录源,cnn,游标类型,锁定类型,命令类型]

相关属性

…….

‘删除当前记录

…….

‘通知rs,我们要

把修改好的记录行写入数据库

‘关闭记录集对象

cnn.Close‘关闭与数据库的连接

setrs=Nothing‘释放rs对象实例

setcnn=Nothing‘释放Connection对象实例

l删除数据库记录前应先找到(查询)待删除的记录项(通过来实

现)。

方法2:使用Connection对象的Execute方法(要求使用者要熟悉SQL命令)

例如:如果要将数据库“成绩.mdb”中的名字为“学生情况表”的数据表中,学号为'07001'

的记录删除,可通过下列方法来实现。

DimcnnAsNewtion‘创建Connection对象cnn,关键字new用于创建

新对象

"Provider=.4.0;DataSource=ACCESS数据库文

件.MDB"‘打开到数据库的连接

进行删除

estrSQL'执行elete语句实现

删除

…….

cnn.Close‘关闭与数据库的连接

‘释放Connection对象实例setcnn=Nothing

‘拼写delete语句,以便sql="deletefrom学生情况表where学号='07001'"

附:分页简介---使用记录集

一、.原理:

分页其实是将数据库中的记录分割成若干段,并将各段记录放在同一个“逻辑页面”上“分

屏显示”出来,其实显示的“逻辑页面”只有1页,只是每次显示的页面记录不同罢了。

过控制各页中数据库显示记录的不同,来刷新页面的显示内容。

二、用到的几个记录集属性

ze:定义一页显示记录的条数;

count:统计数据库记录总数;

unt:统计总页数;

tepage:将数据库指针移动到当前页要显示的数据记录的第一条记录;比如有20

条记录的一个数据库,我们分为一页显示5条记录,如将AbsolutePage属性设为2,则当

前记录指针移至第2页第1条记录,也即将指针移动到第6条记录处,依次类推....

(AbsolutePage属性是以1为起始的)