首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

关于ado Recordset的一个有关问题

2013-08-04 
关于ado Recordset的一个问题Recordset里面是否可以实现类似sql distinct的功能[解决办法]distinct 是去除

关于ado Recordset的一个问题
Recordset里面是否可以实现类似sql distinct的功能
[解决办法]
distinct 是去除重复的记录。
如果你的数据集中存在重复的记录(一模一样的两个记录),那么用SQL distinct 重新查询一次,得到一个符合要求的数据集是最简单的办法。

如果你不想重新查询一次,或者重新查询一次代价太大,那么你就自己在客户端实现distinct的功能吧,无非是全字段排序,然后比较,移除重复的记录。

"主界面里面需要显示的是数据集,然后左边treeview要显示数据集里面包含的种类"按这个描述,是不是你需要的是类似于Excel的过滤功能呢,也就是取得每一字段的唯一值,让用户挑选过滤。这种需求其实现是如果用SQL也是可以实现的,不想用SQL就遍历DataSet,自己计算唯一值。
#include <vector>
#include <algorithm>

std::vector< std::vector<String> > R(DataSet->FieldCount);
for(int i = 0 ; i < DataSet->FieldCount ; ++i)
  R[i].resize(DataSet->RecordCount);
DataSet->First();
for(int i = 0 ; !DataSet->Eof ; DataSet->Next(),++i)
for(int j = 0 ; j < DataSet->FieldCount ; ++j)
  R[j][i] = DataSet->Fields->Fields->Text ; 
for(int i = 0 ; i < DataSet->FieldCount ; ++i)
{
  std::sort(R[i].begin(),R[i].end());
  std::remove(std::unique(R[i].begin(),R[i].end()),R[i].end());
}
//完成后 R[i]数组中有每一字段的唯一值
//如果内存紧张,可以释放一部分多余的内存
for(int i = 0 ; i < DataSet->FieldCount ; ++i)
{
  if(R[i].size < DataSet->RecordCount)
  {
    std::vector<String> tmp = R[i] ; 
    std::swap(R[i],tmp); 
  }
}

Recordset 没有类似的功能。

热点排行