Как проверить существование столбца в строке?
Вводим значение столбца, например — 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
и выполняем соответствующие действия.
Я смог помочь?