• 主页
  • 基础类
  • 应用实例
  • 新技术前沿

ADO访问SQLSERVER时组件游标类型选择的两难局面

mahongxi 2005-05-16 01:31:49
delphi 代码
//-------part A--------------------
ADOConnection1.Connected := True;
ADOQuery1.SQL.Text := 'SELECT * FROM 消息';
ADOQuery1.Active := True;

//-------part B--------------------
ADOQuery1.active := False;
ADOQuery1.SQL.Text := 'SELECT 1; SELECT 2; SELECT 3';
ADOQuery1.Active := True;

rs1 := ADOQuery1.NextRecordset(dummy);
//error of next line:
//Current provider does not support returning multiple recordsets from a single execution
rs2 := ADOQuery1.NextRecordset(dummy);


在开发中遇到这样的难题,如果ADOQuery1 采用了CursorLocation = clUseClient,则part B取得多记录集OK,但 part A
部分取得大量数据时,没有分页处理(也就是说程序要把所有记录[可能有上万笔]拉到本地再执行).
如果采用 CursorLocation = clUseServer CursorType = ctDynamic, 第一部分OK,会立即返回,但如果与DATAGRID绑定会报错

在一个单向性的数据集上进行了非法操作

而且在执行第二部分
rs2 := ADOQuery1.NextRecordset(dummy);
会报错

Current provider does not support returning multiple recordsets from a single execution

现在的系统中,如果采用CursorLocation = clUseClient, CursorType = ctStatic 的方式,可以工作,但由于一次性下载数据,
系统性能简直是不能使用.
所以请各位出出招,如果用 CursorType = ctDynamic 方式工作,此外,用这种方式工作还会出现什么其它需要注意的问题,请大家多多支持.
...全文
56 点赞 收藏 5
写回复
5 条回复
mahongxi 2005年05月16日
To zjcxc(邹建) ( ) :
这个改动量太大啦... 我再发一贴到DELPHI版问一问.
回复 点赞
那就改方式吧,比如使用存储过程分页,当然灵活性少了很多.
回复 点赞
mahongxi 2005年05月16日
To zjcxc(邹建) ( ) :
这个时间是不可等待的,太久了
回复 点赞
程序的东东不会.


但据我以前使用ADO对象时的测试,CursorLocation = clUseClient并不会把所有记录拉到客户端,它只是获取的信息比使用CursorLocation = clUseServer要多得多,因此会慢一些.

但也相比把全部数据拉回来来说,还是要快很多.(我的测试方式是在查询分析器中完成查询的时间与使用ADO对象打开记录集的时间做比较.当然,这会产生一定的差异)
回复 点赞
Well 2005年05月16日
沒有用過

隻有幫樓主你的UP

樓主自己本身就是牛人了。

呵呵呵!!

學習啊
回复 点赞
发动态
发帖子
MS-SQL Server
创建于2007-09-28

1.4w+

社区成员

25.3w+

社区内容

MS-SQL Server相关内容讨论专区
社区公告
暂无公告