sqlite3_bind_text() 不绑定占位符

问题描述 投票:0回答:1

我正在尝试使用 sqlite 文档中所述的占位符参数。 下面是我正在运行的代码。

无论我在sql命令中如何定位

?
sqlite3_bind_text()
都不起作用。我还尝试过
@table
:table
?1
作为 占位符。我什至尝试用显式
exec
替换前两个
prepare
调用 和
step
来电。

有趣的是,如果我有这样的子句,

sqlite3_bind_int()
就可以工作:

sql = "SELECT * FROM test WHERE rowid = ?;";

使用

sprintf()
也有效:

sprintf(sql, "SELECT %s FROM test;", "message");

/* gcc -l sqlite3 retrieve.c -o retrieve */

#include <stdio.h>
#include <sqlite3.h>

int main()
{    
    sqlite3 *db;
    sqlite3_stmt *stmt;

    int result;

    const char *sql;
    char *err_msg;
    
    err_msg = 0;

    result = sqlite3_open("test.db", &db);

    if (result)
    {
        fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
        sqlite3_close(db);
        return(1);
    }
                
    sql = "CREATE TABLE IF NOT EXISTS test ("
        "id             INTEGER PRIMARY KEY,"
        "message        TEXT    NOT NULL );";

    result = sqlite3_exec(db, sql, NULL, 0, &err_msg);
    
    if (result != SQLITE_OK)
    {
        fprintf(stderr, "SQL exec error: %s\n", err_msg);
        sqlite3_free(err_msg);
    }

    sql = "INSERT INTO test (message) VALUES ('hi how ya doin');"; 
    
    result = sqlite3_exec(db, sql, NULL, 0, &err_msg);
    
    if (result != SQLITE_OK)
    {
        fprintf(stderr, "SQL exec error: %s\n", err_msg);
        sqlite3_free(err_msg);
    }
                
    sql = "SELECT message FROM ?;"; /* doesn't work */
    /* sql = "SELECT ? FROM test;";    /\* doesn't work *\/ */

    result = sqlite3_prepare_v2(db, sql, -1, &stmt, NULL);
    
    result = sqlite3_bind_text(stmt, 1, "test", -1, SQLITE_STATIC); /* doesn't work */
    /* result = sqlite3_bind_text(stmt, 1, "message", -1, SQLITE_STATIC); /\* doesn't work *\/ */
    
    if (result != SQLITE_OK)
    {
        fprintf(stderr, "Could not bind string\n");
    }
    else
    {
        printf("SQLITE_OK\n");
    }
        
    while (sqlite3_step(stmt) == SQLITE_ROW) /* checking for done leaves room for error */
    {
        printf("%s\n", sqlite3_column_text(stmt, 0));
    }

    sqlite3_finalize(stmt);    
    sqlite3_close(db);

    return 0;
}
c sqlite
1个回答
0
投票

占位符可用于存储要在 sql 表达式中使用的。 来自doc

“变量”或“参数”标记指定了占位符 表达式,用于在运行时使用以下方式填充的值 sqlite3_bind() 系列 C/C++ 接口。

© www.soinside.com 2019 - 2024. All rights reserved.