我在我的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);
我的问题是我有一个每次更改的szBuffer,我必须将其作为新条目插入到表中。
有没有办法增加主键并将我的字符串存储到其中?
单行的sz缓冲区将提供如下数据:对于Ex:
szBuffer:
ersion = 1 [SPI]:MinorVersion = 2 [SPI]:实时 = 1434260351 [SPI]:SR#= SBB-ST1000090
我传递的字符串中的SQL命令如下:
SQL命令:
插入M_DATA(ID,DETAILS)值(9, 'ersion = 1 [SPI]:MinorVersion = 2 [SPI]:实时= 1434260351 [SPI]:SR#= SBB-ST1000090');
我得到的错误就像:
SQL错误:附近“¸”_“:语法错误
我不确定我这样做是对还是错。 我们可以在循环中使用insert语句吗?我是以正确的方式传递弦乐的吗? (当我把它打印出来时,它对我来说是正确的。) 但为什么我会收到错误?
有没有更好的方法输入我的数据? 我对此非常陌生,所以我尝试搜索互联网,但没有人像我这样做。 请帮忙。
非常感谢。
答案 0 :(得分:4)
(几乎)从不通过字符串连接构建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);