SOCI rowset<row> странная ошибка

Я недавно установил SOCI библиотеку для своего проекта, потому что она требует работы с базой данных SQLite. Я пытался получить набор строк, но я получил странную ошибку:

"c:\mingw\include\soci\exchange-traits.h:35:5: error: incomplete type 'soci::details::exchange_traits<soci::row>' used in nested name specifier".

Я понятия не имею, что не так с моим кодом... строка, которая делает эту ошибку:

soci::rowset<> results = (sql.prepare << "SELECT * from games where user_name='" << user.getName() << "'");

Кстати, я использую самую последнюю версию SOCI. более широкая часть кода:

soci::session& sql = conn.getSession();
soci::rowset<> results = (sql.prepare << "SELECT * from games where user_name='" << user.getName() << "'");
for(soci::rowset<>::const_iterator it = results.begin(); it != results.end(); ++it)...

1 ответ

Решение

Вы должны указать тип soci::rowset потому что это шаблонный тип. Так, например, если вы select целочисленный столбец, вы бы использовали soci::rowset<int> как тип для results, Ваш пример является особым случаем, потому что вы еще не знаете тип, но для этого соц. soci::row типа, чтобы вы могли использовать soci::rowset<soci::row> results

Кроме того, вы никогда не должны строить свой запрос путем конкатенации строк ввода пользователя, поэтому вместо sql.prepare << "SELECT * from games where user_name='" << user.getName() << "'" использованиеsql.prepare << "SELECT * from games where user_name=:name", soci::use(name,user.getName()); вместо.

В противном случае вы уязвимы для так называемых SQL-инъекций.

Другие вопросы по тегам