您的位置:首页 > 数据库

ADO操作数据库(四)--检测数据

2013-12-13 23:24 471 查看
    在上几篇文章中,我们介绍了获取数据的各种方法,现在我们将介绍如何去检测我们所获得的记录集的相关信息和操作,包括当前记录,记录集大小,如何导航数据等。

    在介绍之前,我们先来了解记录集的的结构。一个记录集包含了一个或者多个Field对象的Fields集合对象,通常一个Field对象代表一个表的字段(一列)。当然一个记录集中也包含了一个或多个Record对象(一行记录)。下图介绍了Recordset对象的结构:





上图的BOF和EOF分别代表了Recordset对象的边界,当BOF为true时表示到了第一条记录的前面(上边界),相应的EOF为true的时表示已经到了Recordset对象的最后一条记录的后面(下边界)。当BOF和EOF都为true时表示此Recordset对象为空表。一般情况下为了不产生命名冲突,我们会在Import指令中给EOF和BOF重命名。理解了Recordset结构和我们将开始介绍Recordset对象相关信息的检测。

1.当前记录和记录集的大小

    当前指的是记录集中光标指定的位置,当我们调用Recordset的Open方法,Command的Execute方法或者Connection对象的Execute方法打开记录时,光标被设置在了第一条记录。记录集的大小由Recordset对象的RecordCount属性所标示,它代表了当前记录集中的记录数。如果这个记录的数量不能确定时这个属性被设置成了-1,如果记录集的光标被设置成了forward-only cursor,这个值也是-1,如果是一static or keyset cursor这个值返回的是记录集的真实记录数,对于一个dynamic cursor这个值可能是-1或者记录集的记录数,这要取决于你的数据提供者。在使用不同的类型的光标可以帮助我们提升程序的性能,特别是在记录量特别大时。为了得到更精确的计算,在调用Recordset.RecordCount前,先将光标移动到最后通过调用Recordset.MoveLast方法。

2.导航记录

    通过Recordset的Move方法我们可以导航记录到指定的位置,当我们给第一参数传递负值时,记录指针会向前移动,如果是正值将会向后移动。如果你的数据提供者支持书签是你可以在第二个参数中传入书签(通过记录集的Bookmark属性获取)那么此时数据就不再是以当前记录来做为参考,而是通过书签做为参考。如果我们给记录集指定了CacheSize属性时,如果我们移动的距离超过了缓存中指定的记录数,那么它将继续获取后续的数据,并将光标移动到目标记录(当前缓存中的下一条记录)。

3.使用书签

    书签是用于标示记录集中的一条记录的位置。当我在使用Find函数或其他移动函数移动时,当光标指到其他地方后可以通过书签快速的回到书签指定位置。

4.页的使用

    页是用来将记录集中的数据分成逻辑的页,能够让我们快速的导航到指定的页。通过PageCout属性我们可以获取页的数量,页的大小我们可以通过PageSize来获取或者设定,如果你的数据提供者不支持此属性时PageCount将会返回-1.我们可以使用AbsolutePage属性来定位到指定的页,并将光标定位到指定页的第一条记录。AbsolutePage属性时基于1开始的。

5.绝对位置

absolutePosition属性用于基于第一条记录去移动记录的指针位置,当然数据提供者也要支持此功能才行。absolutePosition也是基于1开始的。当我们在设置absolutePosition的值时虽然位置在当前缓存(CacheSize指定的大小)中,但是Ado也会去加载后续的记录并将absolutePosition指定的记录作为当前缓存中的第一条记录。

下面我们就上面的5项内容写一个Demo,如果知道指针当前的位置就就懂的了上面5项功能的使用了

1: //先创建一个新的记录集对象
2:     _RecordsetPtr recordSetProperty = NULL;
3:     TESTHR(recordSetProperty.CreateInstance(__uuidof(Recordset)));
4:     //打开一个记录
5:     recordSetProperty->CacheSize  = 3; //允许内存中加载3条记录
6:     recordSetProperty->PageSize    = 3; //每一页允许3条记录
7:     recordSetProperty->Open("UserInfo", strConnStr, adOpenStatic, adLockPessimistic, adCmdTable);
8:     recordSetProperty->Supports(adBookmark);
9:     if (recordSetProperty->RecordCount > 0)
10:     {
11:       cout<<"Count of Recordset is:"<<recordSetProperty->RecordCount<<endl;
12:       cout<<"Count of page is:"<<recordSetProperty->PageCount<<endl;
13:       if (recordSetProperty->PageCount >= 2) //基于1开始的
14:       {
15:         recordSetProperty->AbsolutePage = (PositionEnum_Param)2;//定位到第二页
16:         PrintTableHeader(recordSetProperty);
17:         PrintTableRecords(recordSetProperty); //此函数将光标移动到表尾去。
18:         recordSetProperty->AbsolutePage = (PositionEnum_Param)2;//定位到第二页
19:         recordSetProperty->Move(3);  //移动到第三页,由于我们设置了PageSize为3所以我们在向下移动3条记录就刚好到达地3页上。
20:         PrintTableHeader(recordSetProperty);
21:         PrintTableRecords(recordSetProperty);
22:       }
23:       //移动到整个表的第一条记录
24:       recordSetProperty->AbsolutePosition = PositionEnum_Param(1);
25:       PrintTableHeader(recordSetProperty);
26:       PrintTableRecords(recordSetProperty);
27:       recordSetProperty->AbsolutePosition = (PositionEnum_Param)4;//定位到第4条记录上,让Ado从新加载后续的3条记录
28:       PrintTableHeader(recordSetProperty);
29:       PrintTableRecords(recordSetProperty);
30:       //在第四条记录设置一个书签
31:       if(recordSetProperty->Supports(adBookmark))//如果支持书签
32:       {
33:         recordSetProperty->AbsolutePosition = (PositionEnum_Param)4;//定位到第4条记录上,由于我们的打印函数会将指针移动到表尾
34:         _variant_t vtBookMark = recordSetProperty->Bookmark;  //书签定位到第4条记录
35:         recordSetProperty->MoveLast(); //移动到最后一条记录上
36:         recordSetProperty->MovePrevious();//打印最后两条记录
37:         PrintTableHeader(recordSetProperty);
38:         PrintTableRecords(recordSetProperty);
39:         recordSetProperty->Bookmark = vtBookMark; //回到书签的位置(第4条记录)
40:         PrintTableHeader(recordSetProperty);
41:         PrintTableRecords(recordSetProperty);
42:       }
43:     }


执行结果:





工程实例:http://download.csdn.net/detail/zw514159799/6711727
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: