查看完整版本: ADO的NextRecordset()的用法(原创)

jjwwang 2006-4-15 19:45

ADO的NextRecordset()的用法(原创)

本人前段时间发现的一个用法,
现贴出来,希望能给没用过NextRecordset()方法的朋友们一点帮助.
错误的地方,请多指正.

/*
*  标题: ADO的NextRecordset()的用法
*  作者:焦佳旺  网名:风归叶   
*  如转载,请保持文档内容的完整性,谢谢!
*/

表1
产品ID  单位重量  销售数量
1         2.5      100
2         3.6       89
3         5.0       20


如果想得到单位重量大于3的产品信息在客户端显示出来(比如用DBGrid).
那么可以很简单的
  select 产品ID,单位重量,销售数量 from 表1 where 单位重量 > 3
就行了.

如果客户又提出来,我还想知道单位重量大于3的产品一共销售了多少.怎么办呢?
我们可以
  select 产品ID,sum(销售数量) as 合计 from 表1 where 单位重量 > 3

我们发现,必须要执行两次.也就是说,有两条SQL语句要发送,当然SQL数据库也就要分别编译.对于简单的SQL语句,
这不算什么,如果是复杂的SELECT查询呢?多少会影响效率吧.

熟悉SQL的朋友们都知道,类似的问题可以用一条SQL语句解决,即加上COMPUTE.

例如:
/*
*执行前,请在SQL2000中安装PUBS示例数据库
*/
USE pubs
SELECT type, price, advance
FROM titles
ORDER BY type
COMPUTE SUM(price), SUM(advance)
执行结果会有两个结果集. 一个是符合条件的数据, 另一个是合计.

那么上面的语句用ADODataset执行可不可以呢?答案是肯定的.
并且返回的也是两个结果集. 说到这,聪明的朋友肯定想到了. ADO的NextRecordset()原来是干这个用的!
例如
  TADOTable *tbl;
  try
  {
    int i;
    tbl = new TADOTable(this);
    tbl->Recordset = dtsFind->NextRecordset( i );
    StatusBar->Panels->Items[0]->Text = "共有记录: " +  IntToStr( dtsFind->RecordCount ) + " 条";
    StatusBar->Panels->Items[1]->Text = "中国税务 " + tbl->Fields->Fields[0]->AsString + " 册";
    StatusBar->Panels->Items[2]->Text = "税务研究 " + tbl->Fields->Fields[1]->AsString + " 册";
  }
  __finally
  {
    delete tbl;  tbl = NULL;
  }

这时候,我就可以访问tbl的中的数据了.也就是合计的数据.
可以发现, 这个方法在查询的时候很有用,一次查询,就可以得到两个"表"的内容了.省了不少事吧!:)
如果你对sql语句很精通,也可以返回3个或更多的结集.
页: [1]
查看完整版本: ADO的NextRecordset()的用法(原创)