sqlite3中实际类型的格式说明符

时间:2014-01-08 15:40:07

标签: c sqlite

我正在尝试将值插入到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',但它不起作用。

提前致谢

1 个答案:

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