垃圾值被插入到SQLite数据库中

时间:2017-03-14 12:40:33

标签: c++ sqlite

enter image description here将值插入数据库,正确插入整数值,但字符串值被某些垃圾值替换。 使用%s或%q作为字符串的占位符。

int sl_no1 = sl_no;
    int ac_no1 = account_no;
    string u_name = name;
    string u_add = address;
    int u_bal = bal;
    cout<<sl_no1<<endl<<ac_no1<<endl<<u_name<<endl<<u_add<<endl<<u_bal;

    /** Create SQL statement */
   //sql = "INSERT INTO ACCOUNT (SL_NO,ACCOUNT_NO, NMAE, ADDRESS, BALANCE) VALUES (" << sl_no1 <<", '"<< ac_no1 <<",'" << u_name <<", '"<< u_add <<", '" << u_bal << "')";
    sql = sqlite3_mprintf("INSERT INTO ACCOUNT VALUES('%d','%d','%q','%q','%d' )", sl_no1,ac_no1,u_name, u_add, u_bal);

    /** Execute SQL statement */
    rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
    if( rc != SQLITE_OK )
    {
        fprintf(stderr, "SQL error: %s\n", zErrMsg);
        sqlite3_free(zErrMsg);
    }
    else
    {
        fprintf(stdout, "Records created successfully\n");
    }

1 个答案:

答案 0 :(得分:6)

我很确定 1 不可能将std::string作为参数传递给变量参数函数,对所有参数使用.c_str()方法你的字符串。

sqlite API是一个 API,因此函数需要"%s" std::string说明符,.c_str()不一样,你可以使用它内部数据通过std::string方法表示,std::string对象是有效的

1 严格说来,因为你做了,但是

  • 它是UNDEFINED BEHAVIOR,垃圾值就在那里,因为该函数试图取消引用SELECT FORMAT ( GETDATE(), 'yyyy/MM/dd', 'ar-SA' ) ,这就是为什么它是未定义的行为。

  • 编译器可能会对此发出警告,如果你正在使用 gcc ,那么它几乎可以肯定你会这样做,忽略警告或编译时没有警告ON。

    < / LI>