数据异步加载
2004-05-21 21:45
363 查看
异步加载是ADO的一种数据加载方式,主要由记录集的options参数来控制!
ADO210.CHM中的格式:
recordset.Open Source, ActiveConnection, CursorType, LockType, Options
Options
可选。Long 值,指示提供者计算 Source 参数的方式(如果该参数表示除 Command 对象之外的某些内容),或者指示 Recordset 应该从以前保存过的文件中恢复。可以是一个或多个 CommandTypeEnum 或 ExecuteOptionEnum 值,这些值可以用位 AND 操作符组合。
ExecuteOptionEnum
指定提供者执行命令的方式。
常量 值 说明
adAsyncExecute 0x10 指示命令将异步执行。
该值不能与 CommandTypeEnum 的值 adCmdTableDirect 组合。
adAsyncFetch 0x20 指示在 CacheSize 属性中指定的初始数量以后的剩余行将被异步检索。
adAsyncFetchNonBlocking 0x40 指示检索时主线程从不会阻塞。如果未检索到所请求的行,当前行将自行移动到文件结尾。
如果从包含持久存储 Recordset 的 Stream 中打开 Recordset,那么 adAsyncFetchNonBlocking 将不起作用;该操作将同步进行并发生阻塞。
当 adCmdTableDirect 选项被用于打开 Recordset 时,adAsynchFetchNonBlocking 不起作用。
adExecuteNoRecords 0x80 指示命令文本是不返回行的命令或存储过程(例如,仅插入数据的命令)。如果检索到任何行,它们将被放弃且不返回。
adExecuteNoRecords 只能作为可选参数传递给 Command 或 Connection 的 Execute 方法。
adExecuteStream 0x400 指示命令执行的结果应当作为流返回。
adExecuteStream 只能作为可选参数传递给 Command 的 Execute 方法。
adExecuteRecord 指示 CommandText 是一个命令或存储过程,它返回应当被作为 Record 对象返回的单一行。
adOptionUnspecified -1 指示未指定命令。
CommandTypeEnum
指定解释命令参数的方法。
常量 值 说明
adCmdUnspecified -1 不指定命令类型的参数。
adCmdText 1 按命令或存储过程调用的文本定义计算 CommandText。
adCmdTable 2 按表名计算 CommandText,该表的列全部是由内部生成的 SQL 查询返回的。
adCmdStoredProc 4 按存储过程名计算 CommandText。
adCmdUnknown 8 默认值。指示 CommandText 属性中命令的类型未知。
adCmdFile 256 按持久存储的 Recordset 的文件名计算 CommandText。只与 Recordset.Open 或 Requery 一起使用。
adCmdTableDirect 512 按表名计算 CommandText,该表的列被全部返回。只与 Recordset.Open 或 Requery 一起使用。若要使用 Seek 方法,必须通过 adCmdTableDirect 打开 Recordset。
该值不能与 ExecuteOptionEnum 的值 adAsyncExecute 组合。
一般用这个参数adAsyncFetch来控制,另外需要
.Properties("Inital Fetch Size")=50
另外可以参考《MSCE的VB分布式应用的开发》
举例,Vb6.0的代码:
Dim AdoRs as ADODB.Recordset
set AdoRs =new ADODB.Recordset
With AdoRs
.CursorLocation = adUseClient
.Properties("Initial Fetch Size") = 50
.Open mstrSQL, AdoCn, adOpenStatic, adLockOptimistic, adAsyncFetch
If .BOF = False Or .EOF = False Then
'--------------
else
End if
End With
总结:很多的网友都问大数量加载的问题,现在这种方式可以较快的返回数据。一般100万数据,前面50条只需要5~6秒就返回来!这个方式需要注意的是:
1。如果返数据量太大,而中途要取消,需要用AdoCn.Cancel来取消查询,否则数据会继续返回数据。
2。如果数据量太大,记录集的释放会有问题。如果数据量在200M~300M时,set adors=nothing 不会快速释放高速缓存。希望有其它网友能够提供自己的见解。
3。对大数据量时,C/S开发中提供翻页/网格的滚动条结合的方式,对用户来话是极为方便。有的网友提供用存储过程来实现。本人在开发过程用分页控件与异步加载的数据源结合,实现了很好的数据浏览。
开发环境:VB6.0+MS SQL Server 2K +Windows ADS 2K通过。
ADO210.CHM中的格式:
recordset.Open Source, ActiveConnection, CursorType, LockType, Options
Options
可选。Long 值,指示提供者计算 Source 参数的方式(如果该参数表示除 Command 对象之外的某些内容),或者指示 Recordset 应该从以前保存过的文件中恢复。可以是一个或多个 CommandTypeEnum 或 ExecuteOptionEnum 值,这些值可以用位 AND 操作符组合。
ExecuteOptionEnum
指定提供者执行命令的方式。
常量 值 说明
adAsyncExecute 0x10 指示命令将异步执行。
该值不能与 CommandTypeEnum 的值 adCmdTableDirect 组合。
adAsyncFetch 0x20 指示在 CacheSize 属性中指定的初始数量以后的剩余行将被异步检索。
adAsyncFetchNonBlocking 0x40 指示检索时主线程从不会阻塞。如果未检索到所请求的行,当前行将自行移动到文件结尾。
如果从包含持久存储 Recordset 的 Stream 中打开 Recordset,那么 adAsyncFetchNonBlocking 将不起作用;该操作将同步进行并发生阻塞。
当 adCmdTableDirect 选项被用于打开 Recordset 时,adAsynchFetchNonBlocking 不起作用。
adExecuteNoRecords 0x80 指示命令文本是不返回行的命令或存储过程(例如,仅插入数据的命令)。如果检索到任何行,它们将被放弃且不返回。
adExecuteNoRecords 只能作为可选参数传递给 Command 或 Connection 的 Execute 方法。
adExecuteStream 0x400 指示命令执行的结果应当作为流返回。
adExecuteStream 只能作为可选参数传递给 Command 的 Execute 方法。
adExecuteRecord 指示 CommandText 是一个命令或存储过程,它返回应当被作为 Record 对象返回的单一行。
adOptionUnspecified -1 指示未指定命令。
CommandTypeEnum
指定解释命令参数的方法。
常量 值 说明
adCmdUnspecified -1 不指定命令类型的参数。
adCmdText 1 按命令或存储过程调用的文本定义计算 CommandText。
adCmdTable 2 按表名计算 CommandText,该表的列全部是由内部生成的 SQL 查询返回的。
adCmdStoredProc 4 按存储过程名计算 CommandText。
adCmdUnknown 8 默认值。指示 CommandText 属性中命令的类型未知。
adCmdFile 256 按持久存储的 Recordset 的文件名计算 CommandText。只与 Recordset.Open 或 Requery 一起使用。
adCmdTableDirect 512 按表名计算 CommandText,该表的列被全部返回。只与 Recordset.Open 或 Requery 一起使用。若要使用 Seek 方法,必须通过 adCmdTableDirect 打开 Recordset。
该值不能与 ExecuteOptionEnum 的值 adAsyncExecute 组合。
一般用这个参数adAsyncFetch来控制,另外需要
.Properties("Inital Fetch Size")=50
另外可以参考《MSCE的VB分布式应用的开发》
举例,Vb6.0的代码:
Dim AdoRs as ADODB.Recordset
set AdoRs =new ADODB.Recordset
With AdoRs
.CursorLocation = adUseClient
.Properties("Initial Fetch Size") = 50
.Open mstrSQL, AdoCn, adOpenStatic, adLockOptimistic, adAsyncFetch
If .BOF = False Or .EOF = False Then
'--------------
else
End if
End With
总结:很多的网友都问大数量加载的问题,现在这种方式可以较快的返回数据。一般100万数据,前面50条只需要5~6秒就返回来!这个方式需要注意的是:
1。如果返数据量太大,而中途要取消,需要用AdoCn.Cancel来取消查询,否则数据会继续返回数据。
2。如果数据量太大,记录集的释放会有问题。如果数据量在200M~300M时,set adors=nothing 不会快速释放高速缓存。希望有其它网友能够提供自己的见解。
3。对大数据量时,C/S开发中提供翻页/网格的滚动条结合的方式,对用户来话是极为方便。有的网友提供用存储过程来实现。本人在开发过程用分页控件与异步加载的数据源结合,实现了很好的数据浏览。
开发环境:VB6.0+MS SQL Server 2K +Windows ADS 2K通过。
相关文章推荐
- Android中ListView异步加载数据
- Android:仿微博Listview与多线程功能(JSON、数据下载、图片加载、Listview、异步任务)
- 使用DataTable插件实现异步加载数据
- Android 应用开发 之通过AsyncTask与ThreadPool(线程池)两种方式异步加载大量数据的分析与对比
- android 异步方式实现数据加载
- 转载 (Android实战)ProgressBar+AsyncTask实现界面数据异步加载
- WinForm中异步加载数据并使用进度条
- echarts模拟从数据库异步加载数据
- 使用CursorLoader异步加载数据
- Cocos2d-js 开发记录:图片数据资源等的异步加载
- EASYUI TREEGRID异步加载数据
- Android_Handler实现异步回调加载数据
- jQuery EasyUI treegrid异步加载数据
- zTree 树插件异步加载地区数据
- 向上滚动或者向下滚动分页异步加载数据(Ajax + lazyload)
- Android studio异步数据加载ListView+Adapter+AsyncTask
- 异步加载数据,图片,展示到listView
- Android 应用开发 之通过AsyncTask与ThreadPool(线程池)两种方式异步加载大量数据的分析与对比
- android 仿google play效果,ListView/GridView下拉刷新,上拉加载更多,自动加载异步请求数据以及分页数据
- 异步加载网络数据,自定义进度条显示