我必须将列信息从数据库复制到结构,问题是它需要 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();
}
最佳答案
您似乎将所有内容复制并存储在结构数组中,其中每个结构都具有相同的成员和相应的记录。通常我们通过迭代器来使用数组。那么为什么不为您的记录集提供一个迭代器并避免完全复制呢?你可以大致这样开始:
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; }
// ...
}
因此,您不仅可以为类似数组的数据源(如记录集)提供方便且标准的接口(interface),还可以直接在需要双向迭代器的类似 STL 的算法中使用它。
如果您的 CRecordset
支持随机访问,那么您的迭代器也很容易支持。否则,随机访问提供本身就是复制的一个很好的理由(例如,对列进行排序)。
关于c++ - 在 C++ 中复制列信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22532299/