使用POCO创建动态命名的SQL表

时间:2016-09-06 20:24:43

标签: c++ sqlite poco-libraries

以下代码创建一个名为" test"的表。在POCO:

#include "Poco/Data/Session.h"
#include "Poco/Data/SQLite/Connector.h"

#include <string>

using namespace Poco::Data::Keywords;
using Poco::Data::Session;

int main(int argc, char** argv)
{
    Poco::Data::SQLite::Connector::registerConnector();
    Session session("SQLite", "test.db");
    session << "CREATE TABLE test (id INTEGER)", now;
    return 0;
}

我想编写一个函数来创建根据给定参数命名的表。我原本想用

int main(int argc, char** argv)
{
    Poco::Data::SQLite::Connector::registerConnector();
    Session session("SQLite", "test.db");
    std::string name = "test";
    session << "CREATE TABLE ? (id INTEGER)", bind(name), now;
    return 0;
}

使用通配符并将其替换为给定名称。据我了解,我甚至不需要bind(复制给定值),use应该足够,因为语句以now终止,但无论如何。

无论我使用哪个关键字(usebinduseRef),程序都会抛出错误或错过数据库&#34;错误。

我还尝试创建Statement并让它创建表格,但没有变化。

我做错了吗?这次通话不允许使用通配符替换吗?我是否必须手动修改呼叫?

如果它是相关的,可以从我的#includes推断,我使用SQLite。

1 个答案:

答案 0 :(得分:0)

想出来。

使用printf格式说明符可在此处使用。所以声明应该是

int main(int argc, char** argv)
{
    Poco::Data::SQLite::Connector::registerConnector();
    Session session("SQLite", "test.db");
    std::string name = "test";
    session << "CREATE TABLE %s (id INTEGER)", name, now;
    return 0;
}

这需要在每次调用时重新编译语句,因此我不确定为什么这是必要的(如果我想创建多个类似的表怎么办?),但 c&#39; est la vie