Mysql++ Query терпит неудачу, только когда переменная запроса является указателем...:S

У меня проблема, которая заставляет меня думать, что я не понимаю чего-то фундаментального. Я использую MySQL++ и при вызове query.execute() (где "query" является экземпляром класса mysqlpp::Query) это работает, но при вызове query->execute() (где "query" является указателем на экземпляр класса myqslpp::Query) тот же запрос не выполняется! Сообщение об ошибке "Запрос был пуст".

Вот код, который я использовал для тестирования этого.

Следующее выполняется без ошибок, и таблица создается в базе данных.

void test1() {
    mysqlpp::Connection conn;
    conn.connect(0, "server", "user", "password");
    conn.select_db("db_name");

    mysqlpp::Query query = conn.query();
    try {
        query << "CREATE TABLE IF NOT EXISTS MY_TABLE (MY_COLUMN SMALLINT)";
        query.execute();
    }
    catch (const mysqlpp::BadQuery&) {
        std::cerr << query.error() << std::endl;
    }
}

В то время как следующий выводит "Запрос был пуст", и таблица не создана в базе данных.

void test2() {
    mysqlpp::Connection conn;
    mysqlpp::Query *query = 0;
    conn.connect(0, "server", "user", "password");
    conn.select_db("db_name");

    query = &conn.query();
    try {
        *query << "CREATE TABLE IF NOT EXISTS MY_TABLE (MY_COLUMN SMALLINT)";
        query->execute();
    }
    catch (const mysqlpp::BadQuery&) {
        std::cerr << query->error() << std::endl;
    }
    query = 0;
}

1 ответ

Похоже, что в последней версии вы сохраняете адрес во временном объекте (возвращаемое значение функции, временно сохраненной в стеке), которая сразу же уничтожается.

Это означает, что ваш запрос не обязательно является действительным, активным объектом, как только вы доберетесь до execute вызов.

Не уверен, какой компилятор вы используете, но g++ обычно дает warning: taking address of temporary предупреждение за такой код

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