В большинстве примеров для SOCI, вызывающий должен знать поля и типы в запросе и указывает их через soci::rowset<>
из boost::tuple<>
или с помощью других средств.
Есть ли способ кодирования без зная типы и количество столбцов заранее, как в SELECT * FROM ...
запрос?
Если да, не могли бы вы опубликовать короткий пример?
soci::rowset<soci::row>
это именно то, что вам нужно — soci::row
обеспечивает динамическое связывание.
Из документов:
Для некоторых приложений желательно иметь возможность выбирать данные из произвольно структурированных таблиц (например, с помощью «select * from …») и форматировать результирующие данные на основе их типа. SOCI поддерживает это с помощью классов soci :: row и soci :: column_properties.
Увидеть:
http://soci.sourceforge.net/doc/3.2/exchange.html#dynamic
http://soci.sourceforge.net/doc/3.2/statements.html#rowset
для деталей.
Выдержка из документации:
Например, приведенный ниже код создает документ XML из выбранной строки данных из произвольной таблицы:
row r;
sql << "select * from some_table", into(r);
std::ostringstream doc;
doc << "<row>" << std::endl;
for(std::size_t i = 0; i != r.size(); ++i)
{
const column_properties & props = r.get_properties(i);
doc << '<' << props.get_name() << '>';
switch(props.get_data_type())
{
case dt_string:
doc << r.get<std::string>(i);
break;
case dt_double:
doc << r.get<double>(i);
break;
case dt_integer:
doc << r.get<int>(i);
break;
case dt_long_long:
doc << r.get<long long>(i);
break;
case dt_unsigned_long_long:
doc << r.get<unsigned long long>(i);
break;
case dt_date:
std::tm when = r.get<std::tm>(i);
doc << asctime(&when);
break;
}
doc << "</" << props.get_name() << '>' << std::endl;
}
doc << "</row>";
Параметр типа T, который необходимо передать в row :: get (), зависит от типа данных SOCI, который возвращается из column_properties :: get_data_type ().
Я не верю, что есть выход. Вероятно, потому что «select *» обычно считается опасным. Столбцы можно добавлять, переупорядочивать и т. Д., И ваш запрос теперь не работает. Сохраните свое будущее отладку и перечислите столбцы.