数据库编程中应用的最多、最复杂的对象就是记录集,数据库中的数据都是通过记录集来输送到用户程序,也是通过记录集将更新的数据返回数据库。下面就来详细说明一下记录集:
1、记录集的属性和方法
(1)记录集的常用属性
BOF属性 当记录集记录指针指向第一条记录时返回True
EOF属性 当记录集记录指针指向最后一条记录时返回True
AbsloutePosition属性 返回当前记录集记录指针,第一条记录为0,是只读属性。
Bookmark属性 返回或设置当前记录集指针的书签,是字符型可读写属性。
每一条记录都有自己唯一的书签,它与记录在记录集中的顺序无关。将Bookmark属性存放到变量中,后面可以通过将该变量赋值给Bookmark属性,并返回到这个记录。
NoMatch属性 当我们使用Find方法查询时,如果未找到则返回True。
Index属性 在执行Seek操作时,需要给此属性设置索引的名字,可以为了不同的需要随时更换,如果没有设置,Seek操作出错。
Filter属性 过滤器,用于筛选符合指定条件的记录。
RecordCount属性 返回记录集中的记录书。为了返回正确的记录数,有时需要先移动到最后一个记录,否则可能得不到正确的结果。
Sort属性 指定记录集的排序方式
(2)记录集的常用方法(注:个别方法不能适用于每种类型的记录集)
1)移动记录指针类方法
MoveFirst,将记录集指针移动到第一条记录。
MoveLast,将记录集指针移动到最后一条记录。
MovePrevious,将记录集指针移动到前一条记录。
MoveNext,将记录集指针移动到下一条记录。
2)增加、删除、修改类方法
AddNew,想记录及增加一条新纪录
Edit,对当前记录进行编辑,修改完成后要用Update方法更新记录。
Update,如果增加或修改了记录,必须用此方法更新。
CancelUpdate,取消更新记录,在使用了Edit或者AddNew方法后放弃修改。
Delete,从记录集中将当前记录删除。
在删除后常使用MoveNext方法移动指针,否则会出现无当前记录的情况,比如:
<SPAN style="FONT-SIZE: 18px">With Data1.Recordset .Delete .MoveNext If .EOF then .MoveLast End With</SPAN> |
3)查找类方法
Seek,在记录集中定位符合条件的特定记录,只能对经过索引的字段进行此操作。
它的语法如下:
Recordset.Seekcomparison,key1,key2. . .key13
其中的comparison可以是6中关系运算符中除了“<>”外的其他运算符,如果建立的是复合索引,用Seek方法的时候可以给出多个键值。例如,要查找学号为970222的记录,可以采用下面操作:
<SPAN style="FONT-SIZE: 18px">With rsStudent .Index=”XH” .Seek “=”,”970222” If .NoMatch Then MsgBox”数据未找到” End With </SPAN> |
FindFirst,在记录集中查询符合条件的第一条记录
FindLast,在记录集中查询符合条件的最后一条记录
FindPrevious,在记录集中查询符合条件的前一条记录
FindNext,在记录集中查询符合条件的下一条记录
例如,查找[XM]字段中第一个姓李的人的程序如下:
<SPAN style="FONT-SIZE: 18px">Dim S As String With Data1.Recordset S=.Bookmark ‘记录当前位置 .FindFirst “XM Like ‘李*’” '查找姓李的人,用“XM=xx”可进行精确查找 If .NoMatch then MsgBox “数据未找到” .Bookmark=S ‘如果没找到,返回到原来的位置 End If </SPAN><SPAN style="FONT-SIZE: 18px">End With </SPAN> |
4)其他方法
Clone,克隆(建立一个复本)记录集
Close,关闭记录集,不用的时候应该关闭,以释放资源
OpenRecordset,据本记录集按指定条件生成一个新记录集,如果要创建一个记录集的子集,应该使用此方法。
2、记录集的使用举例
打开我们前面创建的数据库,并写一条记录在里面,本例是直接给记录赋值,完全可以设计一个界面,然后从上面的TextBox或者其他空间中取出值并赋值给记录,因为界面设计不是本章的主题,所以从略,程序如下:
<SPAN style="FONT-SIZE: 14px">
</SPAN><SPAN style="FONT-SIZE: 18px"> Dim db As Database
‘数据库对象 Dim rs As Recordset ‘记录集对象</SPAN>
<SPAN style="FONT-SIZE: 18px"> 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 ‘关闭数据库 </SPAN> |
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对象是可以索引的,它定位数据的速度是最快的。如果希望能够对查询选定的一系列记录进行更新,可以使用动态集。如果在特殊的情况下不能使用表类型的记录集,或者只需对记录进行扫描,那么使用快照类型可能会快一些。
|