如何在C中的String中设置变量占位符

时间:2018-04-25 07:51:38

标签: c string variables sqlite

如何在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);

2 个答案:

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