使用sqlite3_exec查询数据记录,并使用外部结构体指针保存查询结果
时间: 2024-03-02 15:53:40 浏览: 124
好的,你可以先定义一个结构体来保存查询结果,比如:
```c
typedef struct {
int id;
char name[50];
int age;
} Person;
```
然后,你可以使用sqlite3_exec函数查询数据记录,并将每条记录保存到该结构体数组中,代码如下:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sqlite3.h>
typedef struct {
int id;
char name[50];
int age;
} Person;
int callback(void *data, int argc, char **argv, char **col_name) {
Person *person = (Person *) data;
int i;
for (i = 0; i < argc; i++) {
if (strcmp(col_name[i], "id") == 0) {
person->id = atoi(argv[i]);
} else if (strcmp(col_name[i], "name") == 0) {
strcpy(person->name, argv[i]);
} else if (strcmp(col_name[i], "age") == 0) {
person->age = atoi(argv[i]);
}
}
return 0;
}
int main() {
sqlite3 *db;
char *error_msg = 0;
int rc;
char *sql;
Person *persons = NULL;
int num_persons = 0;
int i;
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;
}
sql = "SELECT * FROM persons";
rc = sqlite3_exec(db, sql, callback, &num_persons, &error_msg);
if (rc != SQLITE_OK) {
fprintf(stderr, "Failed to select data\n");
fprintf(stderr, "SQL error: %s\n", error_msg);
sqlite3_free(error_msg);
sqlite3_close(db);
return 1;
}
persons = (Person *) malloc(num_persons * sizeof(Person));
if (persons == NULL) {
fprintf(stderr, "Out of memory\n");
sqlite3_close(db);
return 1;
}
for (i = 0; i < num_persons; i++) {
sql = "SELECT * FROM persons LIMIT 1 OFFSET ?";
rc = sqlite3_exec(db, sql, callback, &persons[i], &error_msg);
if (rc != SQLITE_OK) {
fprintf(stderr, "Failed to select data\n");
fprintf(stderr, "SQL error: %s\n", error_msg);
sqlite3_free(error_msg);
sqlite3_close(db);
return 1;
}
}
for (i = 0; i < num_persons; i++) {
printf("ID = %d, Name = %s, Age = %d\n", persons[i].id, persons[i].name, persons[i].age);
}
sqlite3_close(db);
free(persons);
return 0;
}
```
在这个例子中,我们首先使用sqlite3_exec函数查询表中数据记录的数目,然后根据记录数目动态分配一个Person结构体数组,接着使用sqlite3_exec函数和LIMIT和OFFSET子句来逐条查询数据记录,并将每条记录保存到Person结构体数组中。最后,我们遍历Person结构体数组,将每个Person结构体的内容输出到控制台上。
需要注意的是,这个例子中的callback函数会在每次查询时被调用,它将会把当前查询结果保存到一个Person结构体中。另外,我们在每次查询时使用了LIMIT和OFFSET子句,它们可以用来控制查询的范围,从而逐条查询数据记录。
阅读全文