gpt4 book ai didi

c++ - Soci:创建自定义类来存储结果

转载 作者:太空宇宙 更新时间:2023-11-04 14:13:55 25 4
gpt4 key购买 nike

我使用 Soci进行数据库查询。现在我需要一个自定义结果集类,它将环绕 soci::rowset。我无法按照下面的代码方式让它工作,仅仅是因为复制构造函数在 soci 中是私有(private)的(根据源文件不支持)。我怎样才能在没有复杂代码的情况下完成带有 soci::rows 列表的包装器(特此 typedef-ed 到 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
}

最佳答案

SOCI 有很多限制,如果不修改源代码似乎不可能完成这样的任务,这意味着您必须自己维护更改(除非开发人员接受补丁,这是有可能的)。

因为我使用wxWidgets,所以我决定恢复数据库层为wxDatabase并将使用它并维护它

关于c++ - Soci:创建自定义类来存储结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12710532/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com