Как проверить существование столбца в строке?

Вводим значение столбца, например — 0045. Если нет такого в БД, то останавливаем приложение, если есть, то продолжаем. Вот такой кусок кода:

scanf("%s", number);

sprintf(sql, "SELECT EXISTS(SELECT number FROM numbers WHERE number = '%s')", number);

rc = sqlite3_exec(db, sql, 0, 0, &err_msg);

if (number < 0 ) {

//работаем

} else {

//не работаем

}

Конечно же ничего не работает, поскольку явно неверно организована проверка. Как можно это реализовать?


Ответы (1 шт):

Автор решения: Мансур

Ваш код содержит несколько ошибок, которые могут привести к некорректной работе программы. Давайте попробуем исправить их и написать корректную проверку существования столбца с заданным значением в базе данных SQLite.

Во-первых, функция sqlite3_exec возвращает код ошибки, который можно использовать для определения результата выполнения запроса. В качестве третьего аргумента вы можете передать функцию обратного вызова, которая будет вызвана для каждой строки результата запроса. В вашем случае достаточно проверить, возвращает ли запрос какие-либо строки.

Во-вторых, выражение if (number < 0 ) некорректно, так как number - это строка (char array), а не число. Вам нужно проверить результат запроса, а не сам номер.

Давайте напишем функцию обратного вызова для sqlite3_exec и используем её для проверки существования номера в базе данных:

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

int callback(void *data, int argc, char **argv, char **azColName) {
    int *exists = (int*)data;
    *exists = atoi(argv[0]); // преобразуем результат в число
    return 0;
}

int main() {
    sqlite3 *db;
    char *err_msg = 0;
    int rc;
    char sql[100];
    char number[100];
    int exists = 0;

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

    if (rc != SQLITE_OK) {
        fprintf(stderr, "Cannot open database: %s\n", sqlite3_errmsg(db));
        sqlite3_close(db);
        
        return 1;
    }

    printf("Введите номер: ");
    scanf("%99s", number); // используйте %99s для предотвращения переполнения буфера

    sprintf(sql, "SELECT EXISTS(SELECT 1 FROM numbers WHERE number = '%s')", number);

    rc = sqlite3_exec(db, sql, callback, &exists, &err_msg);

    if (rc != SQLITE_OK) {
        fprintf(stderr, "SQL error: %s\n", err_msg);
        sqlite3_free(err_msg);
        sqlite3_close(db);
        
        return 1;
    }

    if (exists) {
        printf("Номер существует в БД.\n");
        // работаем
    } else {
        printf("Номер не существует в БД.\n");
        // не работаем
    }

    sqlite3_close(db);

    return 0;
}

В этом коде мы создали функцию обратного вызова callback, которая будет обновлять переменную exists, основываясь на результате запроса. Если номер существует в базе данных, exists будет установлен в 1, иначе в 0. Затем мы проверяем значение exists и выполняем соответствующие действия.

Я смог помочь?

→ Ссылка