Как кодировать для SELECT * с SOCI?

В большинстве примеров для SOCI, вызывающий должен знать поля и типы в запросе и указывает их через soci::rowset<> из boost::tuple<> или с помощью других средств.

Есть ли способ кодирования без зная типы и количество столбцов заранее, как в SELECT * FROM ... запрос?

Если да, не могли бы вы опубликовать короткий пример?

0

Решение

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 ().

3

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

Я не верю, что есть выход. Вероятно, потому что «select *» обычно считается опасным. Столбцы можно добавлять, переупорядочивать и т. Д., И ваш запрос теперь не работает. Сохраните свое будущее отладку и перечислите столбцы.

0

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