使用C的Sqlite,验证表中是否存在数据

时间:2015-09-05 17:14:53

标签: c sqlite

我正在使用sqlite数据库在C中构建应用程序。我有一个sqlite数据库,我存储了许多IP地址(文本)。如果用户输入了ip地址,我希望我的应用程序检查该ip是否在数据库中。我可以用Python很容易,但我不能在C中生成相同的内容。请在下面找到我的代码。

sqlite3 *db;
sqlite3_stmt *res;
int rec_count = 0;
int rc;
char *errMSG;
const char *tail;
char *ip = "192.168.10.10";
int error = sqlite3_open("C:\\botdetect\\IP.db", &db);
if (error)
{
    fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
}

char *sql = "SELECT * FROM ipaddress WHERE IP=?";

sqlite3_prepare_v2(db, sql, -1, &res, 0);
sqlite3_bind_text(res, 1, ip, sizeof(ip), SQLITE_STATIC);
rc = sqlite3_step(res);

printf("rc is %d\n", rc);

sqlite3_finalize(res);

1 个答案:

答案 0 :(得分:0)

您收到错误了吗?你的程序崩溃了吗?你看到的行为是什么?

要进行故障排除(以及几乎总是好主意的事情),您应该检查sqlite3_*来电的返回值。

您可以找到结果代码列表here。此外,您可以使用here提供的方法打印出人类可读的错误字符串。

例如,要检查sqlite3_prepare_v2()调用是否成功,您可以将其更改为:

int sqlite_status;
sqlite_status = sqlite3_prepare_v2(db, sql, -1, &res, 0);
if (sqlite_status != SQLITE_OK) {
    printf("Error is: %s\n", sqlite3_errstr(sqlite_status));
}

您可以通过sqlite3_bind_text()电话以及sqlite3_step()电话执行类似操作。

可能与您所看到的任何问题无关,是您定义const char *tail以存储指向SQL语句未使用部分的指针。您实际上从未将此值传递到sqlite3_prepare_v2()函数,而是传入0。我实际上会使用你已定义的变量。