-3 c++ sqlite serial-port
我在我的 C++ 程序中使用 SQLite3 头文件并尝试创建一个表并向其插入数据,它在常规输入上工作正常。
当我在带有更改变量的 C++ 循环中使用它时,它显示错误。
我正在使用数据库插入来自 RS-232 的读数。
这是我的代码:
sqlite3 *db;
char *zErrMsg = 0;
int rc;
char *sql;
std::string sql_str;
std::ostringstream temp;
std::string command;
/* Open database */
rc = sqlite3_open("test_1.db", &db);
if (rc){
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
exit(0);
}
else{
fprintf(stderr, "Opened database successfully\n");
}
std::string str;
std::ostringstream oss;
oss << id_count; // stornig the primary id int values into a string
str = "INSERT INTO M_DATA (ID, DETAILS) VALUES(";
str += oss.str(); //copying the int primary id
str += ", '";
std::string str_t1(szBuffer); //Copying character aray to a string
str += str_t1; //concatening the string
str += "');";
//printing what the database takes
//output_file << std::endl << str << std::endl;
char * writable = new char[str.size() + 1];
std::copy(str.begin(), str.end(), writable);
writable[str.size()] = '\0'; // don't forget the terminating 0
sql = writable;
output_file << std::endl << "## SQL COMMAND : " << sql << "#" << std::endl;
// don't forget to free the string after finished using it
delete[] writable;
rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
if (rc != SQLITE_OK){
fprintf(stderr, "SQL error: %s\n", zErrMsg);
output_file << std::endl << "** SQL ERROR : " << zErrMsg << "*" << std::endl;
sqlite3_free(zErrMsg);
}
else{
fprintf(stdout, "Records created successfully\n");
}
// _sleep(3000);
sqlite3_close(db);
Run Code Online (Sandbox Code Playgroud)
我的问题是我有一个 szBuffer 每次都会改变,我必须将它作为新条目插入表中。
有没有办法增加主键并将我的字符串存储到其中?
单行的 sz 缓冲区将提供如下数据: 例如:
szBuffer :
ersion = 1 [SPI]: MinorVersion = 2 [SPI]: Real Time = 1434260351 [SPI]: SR # = SBB-ST1000090
我传递的字符串中的SQL命令是这样的:
SQL 命令:
INSERT INTO M_DATA (ID, DETAILS) VALUES(9, 'ersion = 1 [SPI]: MinorVersion = 2 [SPI]: Real Time = 1434260351 [SPI]: SR # = SBB-ST1000090');
我得到的错误是这样的:
SQL 错误:
“¸”_ 附近:语法错误
我不确定我这样做是对还是错。我们可以在循环中使用插入语句吗?我是否以正确的方式传递字符串?(当我打印出来时,它看起来是正确的。)但是为什么会出现错误?
有没有更好的方法来输入我的数据?我对此很陌生,所以我尝试在互联网上搜索,但没有人像我那样做。请帮忙。
非常感谢。
(几乎)从不通过字符串连接构建 SQL 语句。使用准备好的语句并绑定参数值。
// Prepare the statement
sqlite3_stmt* stmt;
int result = sqlite3_prepare_v2(db, "INSERT INTO M_DATA (ID, DETAILS) VALUES(?, ?);", -1, &stmt, nullptr);
// TODO: Handle when result != SQLITE_OK
while(/* whatever you wanted to loop on */)
{
// Bind in the parameter values
result = sqlite3_bind_int(stmt, 1, id_count);
// TODO: Handle when result != SQLITE_OK
result = sqlite3_bind_text(stmt, 2, szBuffer, -1, SQLITE_STATIC);
// TODO: Handle when result != SQLITE_OK
// Invoke the statement
result = sqlite3_step(stmt);
// TODO: Handle when result != SQLITE_OK
// Reset the statement to allow binding variables on the next iteration
result = sqlite3_reset(stmt);
}
// Release the statement
sqlite3_finalize(stmt);
Run Code Online (Sandbox Code Playgroud)