Soci: создать пользовательский класс для хранения результатов

я использую Soci делать запросы к базе данных. Теперь мне нужно иметь собственный класс набора результатов, который будет обтекать soci :: rowset. Я не могу заставить его работать так, как мой код ниже, просто потому, что конструктор копирования является закрытым в soci (не поддерживается в соответствии с исходным файлом). Как я могу получить упаковщик со списком soci :: row (при этом typedef-ed to 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 is soci :: сессия

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
}

1

Решение

У SOCI есть много ограничений, и выполнение такой задачи кажется невозможным без изменения источников, что будет означать, что вы должны поддерживать изменения самостоятельно (если разработчики не примут исправления, что является вероятностью).

Поскольку я использую wxWidgets, я решил восстановить слой базы данных как wxDatabase и будет использовать это и поддерживать его

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]