sqlite3_bind_text() не привязывает заполнители

#c #sqlite

#c #sqlite

Вопрос:

Я пытаюсь использовать параметры заполнителя, как описано в документации sqlite . Ниже приведен код, который я запускаю.

Независимо от того, как я размещаю ? в команде sql, sqlite3_bind_text() не работает. Я также пробовал @table , :table , и ?1 в качестве заполнителей. Я даже попытался заменить первые два exec вызова на prepare step вызовы explicit и .

Интересно то, что это 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 resu<

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

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

    if (result)
    {
        fprintf(stderr, "Can't open database: %sn", 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, amp;err_msg);
    
    if (result != SQLITE_OK)
    {
        fprintf(stderr, "SQL exec error: %sn", err_msg);
        sqlite3_free(err_msg);
    }

    sql = "INSERT INTO test (message) VALUES ('hi how ya doin');"; 
    
    result = sqlite3_exec(db, sql, NULL, 0, amp;err_msg);
    
    if (result != SQLITE_OK)
    {
        fprintf(stderr, "SQL exec error: %sn", 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, amp;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 stringn");
    }
    else
    {
        printf("SQLITE_OKn");
    }
        
    while (sqlite3_step(stmt) == SQLITE_ROW) /* checking for done leaves room for error */
    {
        printf("%sn", sqlite3_column_text(stmt, 0));
    }

    sqlite3_finalize(stmt);    
    sqlite3_close(db);

    return 0;
}
  

Комментарии:

1. Вы не можете привязывать имена таблиц или столбцов, только значения.

2. Вау! Спасибо вам за это. Где это задокументировано? Поместите это и источник в ответ, и я отмечу его.