使用的函数介绍
这里sqlite3_open、sqlite3_close就不介绍了
sqlite3_prepare_v2():
- 函数原型:
int sqlite3_prepare_v2(sqlite3* db, const char* zSql, int nByte, sqlite3_stmt** ppStmt, const char** pzTail);
- 作用:准备 SQL 语句以供执行。这个函数将 SQL 语句编译为一个预处理语句对象,并返回一个状态码以指示编译过程中的任何错误。
- 参数解释:
db
:指向已打开的 SQLite 数据库的指针。zSql
:要准备的 SQL 语句的字符串。nByte
:要准备的 SQL 语句的字节数,如果为负数,则直到遇到字符串的终止符(NULL 终止符)。ppStmt
:用于存储编译后的预处理语句对象的指针。pzTail
:输出参数,用于指向未使用的 SQL 语句部分的指针,通常为 NULL。sqlite3_step():
- 函数原型:
int sqlite3_step(sqlite3_stmt* pStmt);
- 作用:执行 SQL 语句的下一个步骤。
- 参数解释:
pStmt
:指向预处理语句对象的指针,该对象是使用 sqlite3_prepare_v2() 编译的。sqlite3_column_int():
- 函数原型:
int sqlite3_column_int(sqlite3_stmt* pStmt, int iCol);
- 作用:从 SQL 查询结果的当前行中获取指定整数列的值。
- 参数解释:
pStmt
:指向预处理语句对象的指针。iCol
:要获取其值的列的索引(从 0 开始)。sqlite3_column_text():
- 函数原型:
const unsigned char* sqlite3_column_text(sqlite3_stmt* pStmt, int iCol);
- 作用:从 SQL 查询结果的当前行中获取指定文本列的值。
- 参数解释:
pStmt
:指向预处理语句对象的指针。iCol
:要获取其值的列的索引(从 0 开始)。- sqlite3_finalize():
- 函数原型:int sqlite3_finalize(sqlite3_stmt* pStmt);
- 作用:接口中用于释放预处理语句对象(prepared statement)所占用资源的函数,可以确保资源被正确地释放,避免内存泄漏等问题。
SQLToLink()
从数据库到链表
方式一:
#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>// 定义链表节点
struct Node {int int1;int int2;char string[100]; // 假设字符串长度最多为 100struct Node* next;
};// 定义链表
struct LinkedList {struct Node* head;
};// 初始化链表
void initLinkedList(struct LinkedList* list) {list->head = NULL;
}// 在链表尾部添加节点
void append(struct LinkedList* list, int int1, int int2, const char* string) {struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));if (newNode == NULL) {fprintf(stderr, "Memory allocation failed.\n");exit(1);}newNode->int1 = int1;newNode->int2 = int2;strcpy(newNode->string, string);newNode->next = NULL;if (list->head == NULL) {list->head = newNode;} else {struct Node* current = list->head;while (current->next != NULL) {current = current->next;}current->next = newNode;}
}int main() {sqlite3* db;sqlite3_stmt* stmt;int rc;// 打开 SQLite 数据库rc = sqlite3_open("your_database.db", &db);if (rc) {fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));return 1;}// 准备查询语句const char* sql = "SELECT * FROM your_table";rc = sqlite3_prepare_v2(db, sql, -1, &stmt, NULL);if (rc != SQLITE_OK) {fprintf(stderr, "SQL error: %s\n", sqlite3_errmsg(db));return 1;}// 初始化链表struct LinkedList list;initLinkedList(&list);// 执行查询并将结果添加到链表while ((rc = sqlite3_step(stmt)) == SQLITE_ROW) {int int1 = sqlite3_column_int(stmt, 0);int int2 = sqlite3_column_int(stmt, 1);const unsigned char* string = sqlite3_column_text(stmt, 2);append(&list, int1, int2, (const char*)string);}// 检查查询结果if (rc != SQLITE_DONE) {fprintf(stderr, "SQL error: %s\n", sqlite3_errmsg(db));return 1;}// 关闭数据库连接sqlite3_finalize(stmt);sqlite3_close(db);// 打印链表内容struct Node* current = list.head;while (current != NULL) {printf("%d %d %s\n", current->int1, current->int2, current->string);current = current->next;}// 释放链表内存current = list.head;while (current != NULL) {struct Node* temp = current;current = current->next;free(temp);}return 0;
}
#include <stdio.h>
#include <sqlite3.h>
#include <stdlib.h>
#include <string.h>
// 定义链表节点
struct stu{int id;char name[20];int score;struct stu *p;
};
//注意这里链表头定义的是指针类型,所以add函数的struct stu **head1应该为二级指针,
//在传递参数时应该传递链表头的地址,没有传递头指针 head 的地址。
//这意味着 add() 函数中对头指针 head 的任何修改都不会反映到 main() 函数中的头指针 head 上struct stu *head;
// 在链表尾部添加节点
void add(struct stu **head1,int id,char *name,int score){struct stu *add = *head1;struct stu *code;code=(struct stu*)malloc(sizeof(struct stu));if(code==NULL){printf("error:malloc no!!!\n");}code->id=id;strcpy(code->name,name);code->score=score;code->p = NULL;if(*head1 == NULL){*head1=code;}else{while(add->p != NULL){add = add->p;}add->p = code;}
}
int main(int argc,char** argv)
{sqlite3 *pd;char *errmsg;sqlite3_stmt *ppStmt;// 准备查询语句char *sql = "select * from stu;";int ret = 0;if(argc<2){printf("input:%s xxx\n",argv[0]);}// 打开 SQLite 数据库if((ret=sqlite3_open(argv[1],&pd))!=0){printf("ret = %d error:%s\n",ret,sqlite3_errmsg(pd));return -1;}if((ret = sqlite3_prepare_v2(pd,sql,-1,&ppStmt,NULL))!=0){printf("ret = %d error:%s\n",ret,errmsg);return -1;}// 执行查询并将结果添加到链表while(sqlite3_step(ppStmt)==SQLITE_ROW){int int1 = sqlite3_column_int(ppStmt,0);const unsigned char *char1 = sqlite3_column_text(ppStmt,1);int int2 = sqlite3_column_int(ppStmt,2);add(&head,int1,(char*)char1,int2);}// 打印链表内容struct stu *stu1 = head;while(stu1 != NULL){printf("id = %d name %s score = %d\n",\stu1->id,stu1->name,stu1->score);stu1 = stu1->p;}// 关闭数据库连接sqlite3_finalize(ppStmt);sqlite3_close(pd);//释放链表内存while (head != NULL) {struct stu* temp = head;head = head->p;free(temp);}return 0;}
LinkToSQL()
从链表到数据库
#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>// 定义链表节点
struct Node {int int1;int int2;char string[100]; // 假设字符串长度最多为 100struct Node* next;
};// 定义链表
struct LinkedList {struct Node* head;
};// 初始化链表
void initLinkedList(struct LinkedList* list) {list->head = NULL;
}// 在链表尾部添加节点
void append(struct LinkedList* list, int int1, int int2, const char* string) {struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));if (newNode == NULL) {fprintf(stderr, "Memory allocation failed.\n");exit(1);}newNode->int1 = int1;newNode->int2 = int2;strcpy(newNode->string, string);newNode->next = NULL;if (list->head == NULL) {list->head = newNode;} else {struct Node* current = list->head;while (current->next != NULL) {current = current->next;}current->next = newNode;}
}int main() {sqlite3* db;int rc;// 打开 SQLite 数据库rc = sqlite3_open("your_database.db", &db);if (rc) {fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));return 1;}// 创建表const char* create_table_sql = "CREATE TABLE IF NOT EXISTS your_table (int1 INTEGER, int2 INTEGER, string TEXT);";rc = sqlite3_exec(db, create_table_sql, NULL, 0, NULL);if (rc != SQLITE_OK) {fprintf(stderr, "SQL error: %s\n", sqlite3_errmsg(db));sqlite3_close(db);return 1;}// 初始化链表struct LinkedList list;initLinkedList(&list);// 在链表中添加一些示例数据append(&list, 123, 456, "Example1");append(&list, 789, 1011, "Example2");// 遍历链表并将数据插入数据库struct Node* current = list.head;while (current != NULL) {// 准备插入语句char insert_sql[200];sprintf(insert_sql, "INSERT INTO your_table (int1, int2, string) VALUES (%d, %d, '%s');", current->int1, current->int2, current->string);// 执行插入语句rc = sqlite3_exec(db, insert_sql, NULL, 0, NULL);if (rc != SQLITE_OK) {fprintf(stderr, "SQL error: %s\n", sqlite3_errmsg(db));sqlite3_close(db);return 1;}current = current->next;}// 关闭数据库连接sqlite3_close(db);return 0;
}