将值插入数据库,正确插入整数值,但字符串值被某些垃圾值替换.
使用%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");
}
Run Code Online (Sandbox Code Playgroud)
我肯定这是不可能的1传递一个std::string
作为参数传递给一个ç可变参数的功能,使用.c_str()为您的所有字符串方法.
sqlite API是一个c API,所以函数期望一个c-string用于说明"%s"
符,这std::string
不是一回事,你可以通过方法使用它的内部数据,这些.c_str()
方法std::string
是有效c的对象的表示-string.
1严格说来,因为你做了,但是
它是UNDEFINED BEHAVIOR,并且垃圾值就在那里,因为函数试图取消引用std::string
,这就是为什么它是未定义的行为.
编译器可能会对此发出警告,如果您正在使用gcc,那么它几乎可以肯定它会如此,您可以忽略警告或编译而不会发出警告ON.