我正在用C语言和sqlite数据库构建一个应用程序。我有一个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);发布于 2015-09-06 02:53:54
你收到错误了吗?你的程序崩溃了吗?您看到的行为是什么?
要进行故障排除(这几乎总是一个好主意),您应该检查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。我实际上会使用你定义的变量。
https://stackoverflow.com/questions/32415719
复制相似问题