如何在C中的String中设置变量占位符?
例如,从变量ID
设置 int id = 1234
。
sql = "INSERT INTO REV_ENTITY (ID, NAME, AGE, ADDRESS, SALARY)" \
"VALUES (99, 'John Doe', 25, 'Rich-Mond ', 65000.00 );";
更新
我想要一个具有变量值的最终String。
根据建议,这不起作用:
sql = "INSERT INTO REV_ENTITY (ID,NAME,AGE,ADDRESS,SALARY)" \
"VALUES (%d, 'REV', 25, 'Rich-Mond ', 65000.00 );";
rc = sqlite3_exec(db, printf(sql, 999), callback, 0, &zErrMsg);
我想在Java中使用这样的东西:
String string = String.format("A string %s", aVariable);
答案 0 :(得分:1)
除了另一个答案中提到的snprintf
,您可以使用sqlite3 API中的char *sqlite3_mprintf(const char*,...)
函数。它使用sqlite printf
内置函数,并使用sqlite3_malloc64()
为字符串分配内存。如果一切顺利,它会返回指向字符串的指针,否则返回NULL
:
int id = 999;
char *sql;
sql = sqlite3_mprintf("INSERT INTO REV_ENTITY (ID,NAME,AGE,ADDRESS,SALARY) VALUES (%d, 'REV', 25, 'Rich-Mond ', 65000.00 )", id);
if (sql != NULL) {
rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
if (rc != SQLITE3_OK)
/* Do some error handling. */
sqlite3_free(sql);
}
与printf
函数系列不同,如果格式与参数不相关,sqlite3_mprintf
无法报告。因此,如果您使用GCC编译器,添加以下代码可能很有用:
extern char *sqlite3_mprintf(const char *format, ...) __attribute__ ((format (printf, 1, 2)));
评论中推荐的另一个解决方案是使用sqlite3 prepare,step和finalize函数:
int id = 999;
sqlite3_stmt *stmt = NULL;
char *sql = "INSERT INTO REV_ENTITY (ID,NAME,AGE,ADDRESS,SALARY) " \
" VALUES (?, 'REV', 25, 'Rich-Mond ', 65000.00 )";
sqlite3_prepare(db, sql, strlen(sql), &stmt, NULL);
/* Bind id. */
sqlite3_bind_int(stmt, 1, id);
if (sqlite3_step(stmt) == SQLITE_DONE) {
printf("Insertion success\n");
} else {
fprintf(stderr, "Insertion error\n");
}
/* Finalize and destroy statement. */
sqlite3_finalize(stmt);
答案 1 :(得分:-1)
使用snprintf
,伪代码如下所示:
int idValue = 1234;
snprintf(buffer, bufferLength, "insert bla bla VALUES (%d, 'John Doe', 25, 'Rich-Mond ', 65000.00 )", idValue);
sqli_execute(buffer);
在你的情况下它看起来像:
//initialize sql variable before sprintfing into it
snprintf(sql, maximumSqlBufferLength "INSERT INTO REV_ENTITY (ID, NAME, AGE, ADDRESS, SALARY) VALUES (%d, 'John Doe', 25, 'Rich-Mond ', 65000.00 );", id);