2015-09-28 2 views
2

Мне нужно интеркалировать команду MySQL с переменными C++, предоставляемыми программой, для создания запроса и отправки.Интеркалированная команда 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 никто не работал.

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

+0

Каким образом они «не работали»? Любые сообщения об ошибках? – Galik

+0

Какие ошибки возникли при выполнении запроса? Вы пытались скопировать результирующую строку запроса и запустить в Workbench MySQL? – PaulF

+0

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

ответ

2

Общий совет, при указании имен таблиц используйте обратные тики `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* необходимое для вызова.

+0

Ничего себе, хороший код! Ctrl + C и Ctrl + V и работали безупречно! Однако при попытке выполнить запрос он возвращает другую ошибку, связанную с переменной: 'dbWriteLinux.h: 71: 37: ошибка: нет соответствующей функции для вызова в sql :: Statement :: executeQuery (std: : ostringstream &)» Рез = stmt-> ExecuteQuery (SQL);' –

+0

Если вы хотите увидеть код, посмотрите: [DbWriteLinux.h] (https://dl.dropboxusercontent.com/u/85576999 /dbWriteLinux.h) –

+0

@LuisHenrique Используйте 'stmt-> executeQuery (sql.str(). c_str());'. Это преобразует 'std :: ostringstream' в' std :: string', а затем в 'const char *', необходимый для вызова. – Galik