我正在尝试将值插入到sqlite3 db中的一个表中,该表包含使用C的REAL类型列。我想知道真实类型的格式说明符。
psql =“插入%q \ (xyz_id,num_of_xyz,time,total,used,rem)值\ ('%q',%i,%i,?,?,?);“;
并使用sqlite3_exec()
执行它这里total,used和rem是REAL类型。那么要使用的格式说明符是什么(?),我尝试使用'%i',但它不起作用。
提前致谢
答案 0 :(得分:2)
sqlite3_mprintf
是一个C函数,使用C类型; %i
代表int
个值。
浮点值将使用%f
格式化。
(请注意%q
使用仅在SQL字符串中有效的转义;您不能使用该字符串格式化表名。)
在任何情况下,将值转换为文本只会被数据库再次解析为浮点值会适得其反。 更好的方法是使用预准备语句,以便您可以使用parameter binding functions,如下所示:
sqlite3 *db = ...;
const char *sql = "INSERT INTO MyTable(xyz_id, num_of_xyz, time, total, used, rem)"
" values (?,?,?,?,?,?)";
sqlite3_stmt *stmt;
if (sqlite3_prepare_v2(db, sql, -1, &stmt, NULL) != SQLITE_OK) {
printf("error: %s\n", sqlite3_errmsg(db));
} else {
sqlite3_bind_text (stmt, 1, "xyz ID", -1, SQLITE_TRANSIENT);
sqlite3_bind_int (stmt, 2, 123);
sqlite3_bind_int (stmt, 3, 456);
sqlite3_bind_double(stmt, 4, 1.23);
sqlite3_bind_double(stmt, 5, 4.56);
sqlite3_bind_double(stmt, 6, 7.89);
if (sqlite3_step(stmt) != SQLITE_DONE)
printf("error: %s\n", sqlite3_errmsg(db));
sqlite3_finalize(stmt);
}