我使用Soci进行数据库查询。现在我需要一个自定义的结果集类,它将环绕 soci::rowset。我无法让它以我的代码在下面的方式工作,因为复制构造函数在 soci 中是私有的(根据源文件不支持)。如何在没有复杂代码的情况下完成包含 soci::rows 列表的包装器(在此为 Row 类型定义)?任何关于如何进行的设计或方向都值得赞赏
我的头文件
typedef soci::row Row;
class ResultSet
{
public:
ResultSet();
~ResultSet();
void Copy(soci::rowset<soci::row>& rs);
Row GetNextRow();
bool HasRows();
private:
soci::rowset<soci::row> m_rows;
soci::rowset_iterator<soci::row> m_iterator;
bool m_isAccessed;//if first access on row is done
};
源文件
ResultSet::ResultSet() {
m_isAccessed=false;
}
ResultSet::~ResultSet() {
}
Row ResultSet::GetNextRow() {
if(m_isAccessed) {
m_iterator++;//increment row
m_isAccessed=true;
}
return *m_iterator;
}
bool ResultSet::HasRows() {
return m_iterator!=m_rows.end();//it have not reached the end yet;
}
void ResultSet::Copy(soci::rowset<soci::row>& rs) {
m_rows = rs;
m_iterator = rs.begin();//put it at row 1
}
这是我在连接的 ExecuteQuery 函数中使用的方法。m_session 是 soci::session
void ConnectionMgr::ExecuteQuery(wxString& sql, ResultSet& rs) {
try {
soci::rowset<soci::row> rsInternal = m_session.prepare<<sql.ToStdString();
rs.Copy(rsInternal);
}
catch (std::exception const& e) {
m_error = wxString::Format(wxT("SqlQuery close error:%s\n"), e.what());
}
}
稍后我想如何使用该类的示例
wxString sql = wxT("-- a query\n SHOW DATABASES;");
ResultSet rs;
m_conn->ExecuteQuery(sql, rs);
while(rs.HasRows())
{
wxString name = wxString(rs.GetNextRow().get<std::string>(0));
//work with name here
}