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 方式工作,此外,用这种方式工作还会出现什么其它需要注意的问题,请大家多多支持.
...全文
104 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
mahongxi 2005-05-16
  • 打赏
  • 举报
回复
To zjcxc(邹建) ( ) :
这个改动量太大啦... 我再发一贴到DELPHI版问一问.
zjcxc 元老 2005-05-16
  • 打赏
  • 举报
回复
那就改方式吧,比如使用存储过程分页,当然灵活性少了很多.
mahongxi 2005-05-16
  • 打赏
  • 举报
回复
To zjcxc(邹建) ( ) :
这个时间是不可等待的,太久了
zjcxc 元老 2005-05-16
  • 打赏
  • 举报
回复
程序的东东不会.


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

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

隻有幫樓主你的UP

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

呵呵呵!!

學習啊

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧