Создайте таблицу SQL с динамическим именем с помощью POCO

Следующий код создает таблицу с именем «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, но это неважно.

Независимо от того, какое ключевое слово я использую (use, bind, useRef), программа выдает ошибку «Ошибка SQL или отсутствующая база данных».

Я также пытался создать Statement и создать таблицу, но без изменений.

Я делаю что-то неправильно? Запрещена ли замена подстановочных знаков в этом вызове? Должен ли я изменить вызов вручную?

Если это имеет значение, как следует из моего #includes, я использую SQLite.


person Wasabi    schedule 06.09.2016    source источник


Ответы (1)


Догадаться.

Здесь работает спецификатор формата 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'est la vie.

person Wasabi    schedule 08.09.2016