我必须将列信息从数据库复制到结构,问题是它需要超过5000次迭代并且非常慢。还有更好的办法吗?
使用的代码位于.h文件中:
struct sFieldDef
{
CString m_strQualifier;
CString m_strOwner;
CString m_strTableName;
CString m_strColumnName;
int m_nDataType;
CString m_strTypeName;
long m_lPrecision;
long m_lLength;
int m_nScale;
int m_nRadix;
int m_nNullable;
};
.cpp文件中使用的代码:
sFieldDef sTempField;
CColumns rsColumns(m_pDatabase);
rsColumns.Open(CRecordset::snapshot);
while( !rsColumns.IsEOF() )
{
sTempField.m_strQualifier=rsColumns.m_strQualifier;
sTempField.m_strOwner=rsColumns.m_strOwner;
sTempField.m_strTableName=rsColumns.m_strTableName;
sTempField.m_strColumnName=rsColumns.m_strColumnName;
sTempField.m_nDataType=rsColumns.m_nDataType;
sTempField.m_strTypeName=rsColumns.m_strTypeName;
sTempField.m_lPrecision=rsColumns.m_lPrecision;
sTempField.m_lLength=rsColumns.m_lLength;
sTempField.m_nScale=rsColumns.m_nScale;
sTempField.m_nRadix=rsColumns.m_nRadix;
sTempField.m_nNullable=rsColumns.m_nNullable;
pArrFiels->Add(sTempField);
rsColumns.MoveNext();
}
答案 0 :(得分:1)
您似乎正在将所有内容复制并存储在结构数组中,其中每个结构都具有相同的成员和相应的记录。通常我们通过迭代器使用数组。那么为什么不为你的记录集提供一个迭代器并完全避免复制呢?你大概可以这样开始:
template <typename RS>
class rs_iterator
{
RS& rs;
public:
rs_iterator(RS& rs) : rs{rs} { }
const RS& operator*() { return rs; }
rs_iterator& operator++() { return rs.MoveNext(), *this; }
// ...
}
因此,您不仅可以为类似数组的数据源(如记录集)提供方便的标准接口,而且可以直接在需要双向迭代器的STL算法中使用它。
如果您的CRecordset
支持随机访问,那么您的迭代器也可以轻松实现。否则,随机访问提供本身就是复制的好理由(例如,对列进行排序)。