关于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 没有类似的功能。