将值插入数据库,正确插入整数值,但字符串值被某些垃圾值替换。 使用%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");
}
答案 0 :(得分:6)
我很确定 1 不可能将std::string
作为参数传递给c变量参数函数,对所有参数使用.c_str()方法你的字符串。
sqlite API是一个c API,因此函数需要"%s"
std::string
说明符,.c_str()
不一样,你可以使用它内部数据通过std::string
方法表示,std::string
对象是有效的c-string。
1 严格说来,因为你做了,但是
它是UNDEFINED BEHAVIOR,垃圾值就在那里,因为该函数试图取消引用SELECT FORMAT ( GETDATE(), 'yyyy/MM/dd', 'ar-SA' )
,这就是为什么它是未定义的行为。
编译器可能会对此发出警告,如果你正在使用 gcc ,那么它几乎可以肯定你会这样做,忽略警告或编译时没有警告ON。
< / LI>