SOCI 行集 <row> 奇怪的错误
SOCI rowset<row> weird error
我最近为我的项目安装了 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)...
您必须指定 soci::rowset
的类型,因为它是模板化类型。因此,例如,如果您 select
一个整数列,您将使用 soci::rowset<int>
作为 results
的类型。你的例子是一个特例,因为你还不知道类型,但是对于这个 soci 已经定义了 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-注入攻击
我最近为我的项目安装了 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)...
您必须指定 soci::rowset
的类型,因为它是模板化类型。因此,例如,如果您 select
一个整数列,您将使用 soci::rowset<int>
作为 results
的类型。你的例子是一个特例,因为你还不知道类型,但是对于这个 soci 已经定义了 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-注入攻击