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
предупреждение за такой код