在条件C ++循环语句中将条目插入SQLite3表中

时间:2015-06-22 20:45:18

标签: 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);

我的问题是我有一个每次更改的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语句吗?我是以正确的方式传递弦乐的吗? (当我把它打印出来时,它对我来说是正确的。) 但为什么我会收到错误?

有没有更好的方法输入我的数据? 我对此非常陌生,所以我尝试搜索互联网,但没有人像我这样做。 请帮忙。

非常感谢。

1 个答案:

答案 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);