我正在使用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);
答案 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
。我实际上会使用你已定义的变量。