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项功能的使用了
执行结果:
工程实例:http://download.csdn.net/detail/zw514159799/6711727
在介绍之前,我们先来了解记录集的的结构。一个记录集包含了一个或者多个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
相关文章推荐
- VB+ADO检测数据库并发操作和处理并解决并发冲突
- VB+ADO检测数据库并发操作和处理并解决并发冲突
- DBHelper,ADO直接操作数据库,扩展DataTable操作数据裤的方法
- VB+ADO检测数据库并发操作和处理并解决并发冲突
- VB+ADO检测数据库并发操作和处理并解决并发冲突
- 使用ADO操作SQL SERVER 通过'OLE DB 访问 ACCESS 数据库 ,实现数据交换
- 安全检测ASP.net网站实例:用DBO操作数据库以获得信息和数据
- ADO 操作数据库(三)--获取数据的各种方法
- MFC VC ADO链接SQL Server数据库 操作数据库数据
- mysql的触发器同数据库多表的数据操作
- VBA Excel 操作ADO数据库
- ObjectARX中调用ADO封装类实现数据库查询读取写入数据的一个类实例
- Mysql命令行下备份恢复数据库数据操作
- 在Java的Hibernate框架中对数据库数据进行查询操作
- 不同服务器数据库之间的数据操作
- 关于数据库的连接,以及对数据增删该查的操作的封装
- MFC中使用ADO操作各类数据库的封装类,包括MySql、Access、Oracle、MSSql
- 连接数据库操作的步骤是什么?每一步的返回值是什么数据类型?
- C# 中有关数据库中数据的操作中,能否自连接
- 不同服务器数据库之间的数据操作