#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. Вау! Спасибо вам за это. Где это задокументировано? Поместите это и источник в ответ, и я отмечу его.