Интеркалировать команду MySQL с переменными C++

71
10

Мне нужно интеркалировать команду MySQL с переменными C++, предоставляемыми программой, для создания запроса и отправки.

У меня есть следующее:

int source, temperature, humidity, airCo, noise;
char query[500];

Попытка № 1:

sprintf (query, "insert into defaultsensor1 (dateTime, temperature, humidity, airCo, noise) values (now(), " + 
temperature + ", " +
humidity + ", " +
airCo + ", " +
noise + ")";

Попытка № 2:

 sprintf (query, "insert into defaultsensor1 (dateTime, temperature, humidity, airCo, noise) values (now(), %i, %i, %i, %i)",
temperature,
humidity,
airCo,
noise );

Попытка № 3:

sprintf (query, "insert into defaultsensor1 (dateTime, temperature, humidity, airCo, noise) values (now(), %s, %s, %s, %s)", 
std::to_string(temperature),
std::to_string(humidity),
std::to_string(airCo),
std::to_string(noise));

... aaaaaand никто не работал.

Учебники в Интернете в основном вращаются вокруг того, что я пробовал выше. Как мне это сделать?

спросил(а) 2015-09-28T19:18:00+03:00 5 лет назад
1
Решение
70

Общий совет, при указании имен таблиц используйте 'tablename' back-ticks 'tablename' чтобы избежать столкновений с ключевыми словами. Поместите значения полей строки в кавычки 'stringvalue'.

Для sql-запросов обычно я использую std::ostringstream потому что он автоматически преобразует числа в строки.

#include <sstream>

int main()
{
int source, temperature, humidity, airCo, noise;

// ... such and so forth ...

std::ostringstream sql;

sql << "insert into 'defaultsensor1'";
sql << " ('dateTime', 'temperature', 'humidity', 'airCo', 'noise')";
sql << " value ";
sql << "(now(), " << temperature << ", " << humidity << ", " << airCo << ", " << noise << ")";

std::cout << "sql: " << sql.str().c_str() << '\n';
}

Примечание. Строка извлекается из std::ostringstream используя sql.str().c_str(), чтобы перейти к вызовам MySQL API.

Например.

res = stmt->executeQuery(sql.str().c_str());

Это преобразует std::ostringstream в std::string а затем в const char* необходимый для вызова.

ответил(а) 2015-09-28T19:37:00+03:00 5 лет назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема