Как обновить столбец с параметризованными запросами в sqlite3 с помощью C? - PullRequest
1 голос
/ 02 апреля 2019

У меня есть одна строка, которая инициализируется на 0. Я хочу обновлять значение этой строки при каждом действии.

char *text="Hello" // Hello is the name of the field, which has one row    
char *sql = "UPDATE Candidate SET ?=?+1;";


rc = sqlite3_prepare_v2(db, sql, -1, &res, 0);

if (rc == SQLITE_OK) {  
    rc = sqlite3_bind_text( res, 1,text,-1,0);
    rc = sqlite3_bind_text( res, 2,text,-1,0);
}

Как обновить столбец с параметризованными запросами?

1 Ответ

0 голосов
/ 02 апреля 2019

Вы не можете привязать имена таблиц или столбцов к значениям параметров SQL.Из документации SQLite

6.Параметры привязки и повторное использование подготовленных операторов

.,.

SQLite допускает параметр везде, где допускается строковый литерал, числовая константа или NULL. (Параметры не могут использоваться для имен столбцов или таблиц.) Параметр принимает одну из следующих форм:

•?
•? NNN
•: AAA
• $ AAA
• @ AAA

В приведенных выше примерах NNN является целочисленным значением, а AAA - идентификатором.Параметр изначально имеет значение NULL.Прежде чем вызвать sqlite3_step () в первый раз или сразу после sqlite3_reset (), приложение может вызвать интерфейсы sqlite3_bind () для присоединения значений к параметрам.Каждый вызов sqlite3_bind () переопределяет предыдущие привязки для одного и того же параметра.

Приложение может заранее подготовить несколько операторов SQL и при необходимости оценить их.Не существует произвольных ограничений на количество незавершенных подготовленных заявлений.Некоторые приложения при запуске запускают sqlite3_prepare () несколько раз, чтобы создать все подготовленные операторы, которые им когда-либо понадобятся.Другие приложения хранят кэш самых последних использованных подготовленных операторов, а затем повторно используют подготовленные операторы из кэша, когда они доступны.Другой подход состоит в том, чтобы повторно использовать подготовленные операторы только тогда, когда они находятся внутри цикла.

Если вы хотите использовать переменное имя столбца в этой ситуации, вам придется динамически создавать строку запроса во время выполнения, что выходит за рамки этого вопроса;что-то вроде этого может работать, но стоит написать функцию подстановки строк, если вы собираетесь делать это часто:

#include <string.h>

int main(int argc, char *argv[]) {
    char buffer[256];
    char *field = "Hello";

    strcpy(buffer, "UPDATE Candidate SET ");
    strcat(buffer, field);
    strcat(buffer, " = ");
    strcat(buffer, field);
    strcat(buffer, " + 1;");
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...