数据库编程中应用的最多、最复杂的对象就是记录集,数据库中的数据都是通过记录集来输送到用户程序,也是通过记录集将更新的数据返回数据库。下面就来详细说明一下记录集:
1、记录集的属性和方法
(1)记录集的常用属性
每一条记录都有自己唯一的书签,它与记录在记录集中的顺序无关。将Bookmark属性存放到变量中,后面可以通过将该变量赋值给Bookmark属性,并返回到这个记录。
如果没有设置,Seek操作出错。
否则可能得不到正确的结果。
(2)记录集的常用方法(注:个别方法不能适用于每种类型的记录集)
1)移动记录指针类方法
2)增加、删除、修改类方法
在删除后常使用MoveNext方法移动指针,否则会出现无当前记录的情况,比如:
With Data1.Recordset
.Delete
.MoveNext
If .EOF then .MoveLast
End With
3)查找类方法
其中的comparison可以是6中关系运算符中除了“<>”外的其他运算符,如果建立的是复合索引,用Seek方法的时候可以给出多个键值。例如,要查找学号为970222的记录,可以采用下面操作:
With rsStudent
.Index=”XH”
.Seek “=”,”970222”
If .NoMatch Then MsgBox”数据未找到”
End With
例如,查找[XM]字段中第一个姓李的人的程序如下:
Dim S As String With Data1.Recordset S=.Bookmark ‘记录当前位置 .FindFirst “XM Like ‘李*’” '查找姓李的人,用“XM=xx”可进行精确查找 If .NoMatch then MsgBox “数据未找到” .Bookmark=S ‘如果没找到,返回到原来的位置 End If End With
4)其他方法
2、记录集的使用举例
打开我们前面创建的数据库,并写一条记录在里面,本例是直接给记录赋值,完全可以设计一个界面,然后从上面的TextBox或者其他空间中取出值并赋值给记录,因为界面设计不是本章的主题,所以从略,程序如下:
Dim db As Database ‘数据库对象 Dim rs As Recordset ‘记录集对象
Set db=DBEngine.Workspaces(0).OpenDatabase(“Students.MDB”)
Set rs=db.OpenRecordset(“students”,dbOpenTable) ‘表的名字也叫students
rs.AddNew ‘增加一条新记录,如果是修改原有记录,则使用Edit方法
With rs
.Fields(“XH”)=CLng(970111)
.Fields(“XM”)=”张思强”
.Fields(“XB”)=”男”
.Fields(“BORN”)=”河北石家庄”
.Fields(“BIRTH”)=”1980-1-1”
End With
rs.Update ‘修改或者增加新纪录后,必须更新数据库才能保存
rs.Close ‘关闭记录集
db.Close ‘关闭数据库
Recordset对象中所含的Fields集合包含了一个记录的各个字段,Fields集合中没有若干个Fields对象,Fields对象的Value属性代表了当前记录的该字段的值,上例中并没有写成像Fields(“XH”).Value或者Fields(0).Value这种形式,是因为Value属性是对象的默认属性,在编写代码时可以省略。对于基本类型的数据可以至今进行赋值,对于超长类型的数据,如歌曲、电影、图片则需要用Field对象的AppendChunk方法和GetChunk方法来进行处理。
3、 记录集的种类
Recordset对象有3中类型,即表(table)、动态集(dynaset)、快照(snapshot)。
表类型的Recordset对象是指当前数据库中的表在创建表类型的记录集时数据库引擎打开的表。后续的数据操作都是直接对表进行的。只能对单个的表打开表类型的记录集,而不能对连接或者联合查询打开表类型的记录集。与其他类型的Recordset对象相比,表类型的搜索与排序速度最快。
动态集类型的Recordset对象可以是本地的表,也可以使返回的行查询结果。它实际上是对一个或者几个表中的记录的一些列引用。可用动态集从多个表中提取和更新数据,其中包括连接的其他数据库中的表。动态类型具有一种与众不同的特点:不同数据库的可更新连接。利用这种特性,可以对不同类型的数据库中的表进行可更新的连接查询。动态集和他的基本表可以互相更新。如果动态集中的记录发生改变,同样的变化也将在基本表中反映出来。在打开记录集的时候,如果其他的用户修改了基本表,那么动态集中也将反映出被修改过的记录。动态集类型是最灵活的,也是功能最强的Recordset类型。
快照类型的Recordset对象包含的数据是固定的,它反映了在产生快照的一瞬间数据库的状态。从Microsoft Jet数据源得到的快照是不可更新的,从开放数据库互连(ODBC)数据源得到的某些快照是可以更新的,这取决于所有数据库系统本身的能力。与动态集类型和表类型的Recordset对象相比,快照的处理开销较少。因此,它执行查询和返回数据的速度更快,特别是在使用ODBC数据源时。快照类型保存了表中所有记录的完整复本,因此,如果记录的个数很多,快照的性能将比动态集慢的多。
使用什么记录集,取决于需要完成的任务是要更改数据还是简单地查看数据。例如,如果必须对数据进行排序或者使用索引,可以使用表。因为表类型的Recordset对象是可以索引的,它定位数据的速度是最快的。如果希望能够对查询选定的一系列记录进行更新,可以使用动态集。如果在特殊的情况下不能使用表类型的记录集,或者只需对记录进行扫描,那么使用快照类型可能会快一些。