基于C语言实现 SQL数据库和链表的相互转换

使用的函数介绍 

这里sqlite3_open、sqlite3_close就不介绍了

  1. 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。
  2. sqlite3_step()

    • 函数原型:int sqlite3_step(sqlite3_stmt* pStmt);
    • 作用:执行 SQL 语句的下一个步骤。
    • 参数解释:
      • pStmt:指向预处理语句对象的指针,该对象是使用 sqlite3_prepare_v2() 编译的。
  3. sqlite3_column_int()

    • 函数原型:int sqlite3_column_int(sqlite3_stmt* pStmt, int iCol);
    • 作用:从 SQL 查询结果的当前行中获取指定整数列的值。
    • 参数解释:
      • pStmt:指向预处理语句对象的指针。
      • iCol:要获取其值的列的索引(从 0 开始)。
  4. sqlite3_column_text()

    • 函数原型:const unsigned char* sqlite3_column_text(sqlite3_stmt* pStmt, int iCol);
    • 作用:从 SQL 查询结果的当前行中获取指定文本列的值。
    • 参数解释:
      • pStmt:指向预处理语句对象的指针。
      • iCol:要获取其值的列的索引(从 0 开始)。
  5. 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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/798396.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WSL2迁移后默认登陆用户为root的解决方案

第一步&#xff0c;在wsl的root用户下面用vim打开/etc/wsl.conf文件 vim /etc/wsl.conf第二步&#xff0c;在文件中添加以下代码, 仅需把user_name替换成你原来wsl的用户名即可 [user] defaultuser_name如 [user] defaultpengyuyan重启wsl,在powershell下输入 wsl --shutdo…

【GDB】GDB解CORE文件

目录 一 GDB解析CORE文件(Linux) 二 GDB解析CORE文件(QNX) 在 Linux 系统中,当一个进程发生崩溃或异常时,它会生成一个所谓的 core dump 文件,其中包含了该进程的内存映像和一些调试信息。这个文件可以用于分析和解决崩溃问题,以便了解进程崩溃时的状态和原因

多模态text-image模型之ITM loss(blip)

主要代码&#xff1a; # forward the positve image-text pair # 正向传播正面的图像文本对 output_pos self.text_encoder.bert(encoder_embedstext_embeds, attention_masktext.attention_mask,encoder_hidden_statesimage_embeds,encoder_attention_maskimage_atts, …

【技术笔记】Ubuntu下VirtualBox不能识别USB解决办法(手把手解决)

环境说明 系统版本&#xff1a;Ubuntu 20.04 VirtualBox版本&#xff1a; 7.0.12 解决过程 扩展下载&#xff0c;进入VirtualBox 官方下载路径。选择本机安装版本&#xff0c;如下图所示&#xff0c;因笔者是7.0.x版本&#xff0c;因此点击第一条链接&#xff1b; 进入版本页…

机器学习(30)

文章目录 摘要一、文献阅读1. 题目2. abstract3. 网络架构3.1 Sequence Generative Adversarial Nets3.2 SeqGAN via Policy Gradient3.3 The Generative Model for Sequences3.4 The Discriminative Model for Sequences(CNN) 4. 文献解读4.1 Introduction4.2 创新点4.3 实验过…

慢SQL问题排查

慢SQL问题排查是一个系统性的过程&#xff0c;它涉及到对数据库性能、查询优化以及系统资源的深入理解。 1. 收集慢查询日志 启用慢查询日志&#xff1a;大多数数据库系统&#xff08;如MySQL、PostgreSQL等&#xff09;都支持慢查询日志功能。启用该功能后&#xff0c;数据库…

关于npm和yarn的使用(自己的问题记录)

目录 一 npm 和 yarn 常用命令 二 package.json中 devDependencies 和 dependencies 的区别。 三 npm安装包时&#xff0c;加 --save和不加的区别 一 npm 和 yarn 常用命令 备注&#xff1a;以下命令以 axios 为例。 未完&#xff1a;待续。。。。 二 ​​​​​​​ …

【Vue3源码学习】— CH2.7 Computed: Vue 3 计算属性深入解析

Computed: Vue 3 计算属性深入解析 1.计算属性的基本用法2. ComputedRefImpl 类深入解析JavaScript 中的 getter 函数 3. 计算属性的创建&#xff1a;computed 方法解析3.1 源码解析3.2 使用示例 4. 计算属性的工作原理5. 手动实现简化的计算属性6. 结语 在 Vue 3 的响应式系统…

【教程】VOC数据集制作

语义分割任务中VOC数据集的制作&#xff0c;任务中只有一种标签&#xff1a;gas 文章目录 1、由黑白图像识别为txt标签2、txt转json3、数据集转VOC格式 1、由黑白图像识别为txt标签 由于使用CycleGAN网络进行风格迁移学习&#xff0c;生成了大量伪标签图像&#xff0c;因此需…

【递归与递推】数的计算|数的划分|耐摔指数

1.数的计算 - 蓝桥云课 (lanqiao.cn) 思路&#xff1a; 1.dfs的变量>每一次递归什么在变&#xff1f; &#xff08;1&#xff09;当前数的大小一直在变&#xff1a;sum &#xff08;2&#xff09;最高位的数&#xff1a;k 2.递归出口&#xff1a;最高位数字为1 3.注意&#…

鱼塘钓鱼(c++实现)

题目 有 N 个鱼塘排成一排&#xff0c;每个鱼塘中有一定数量的鱼&#xff0c;例如&#xff1a;N5 时&#xff0c;如下表&#xff1a; 即&#xff1a;在第 1 个鱼塘中钓鱼第 1 分钟内可钓到 10 条鱼&#xff0c;第 2 分钟内只能钓到 8 条鱼&#xff0c;……&#xff0c;第 5 分…

Codeforces Round 932 (Div. 2) ---- F. Andrey‘s Tree ---- 题解

F. Andreys Tree&#xff1a; 题目描述&#xff1a; 思路解析&#xff1a; 我们假设删除任意一个结点后&#xff0c;我们会将整个树切分为k个联通块&#xff0c;那么可以明确的知道我们只需要连接(k-1)条边就可以将这k个联通块重新连为一棵树。 那么最小代价是啥呢? 图解分…

0基础进入IT行业

0基础如何进入IT行业&#xff1f; 简介&#xff1a;对于没有任何相关背景知识的人来说&#xff0c;如何才能成功进入IT行业&#xff1f;是否有一些特定的方法或技巧可以帮助他们实现这一目标&#xff1f; 方向一&#xff1a;学习路径 对于零基础进入 IT 行业的人来说&#xff…

第十五题:最大距离

题目描述 在数列 a1,a2,⋯ ,an​中&#xff0c;定义两个元素 ai 和 aj​ 的距离为∣i−j∣∣ai−aj∣&#xff0c;即元素下标的距离加上元素值的差的绝对值&#xff0c;其中 ∣x∣ 表示 x 的绝对值。 给定一个数列&#xff0c;请问找出元素之间最大的元素距离。 输入描述 …

【网站项目】校园订餐小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

鱼骨图功能实现

dom: <div class="module-content"><div class="title"><span>[</span><p>鱼骨图</p><span>]</span></div><div class="line-mian"></div><div :ref="module + i&q…

通过UDP实现参数配置

来讲讲UDP的一种常见应用 我们知道UDP是一种无连接的网络传输协议&#xff0c;在发送数据时指定目标IP及端口就可以将数据发送出去&#xff0c;因此特别适合用作网络设备发现。 我们可以自定义一个通信端口&#xff0c;假设为55555。我们再制定一个协议用于查询目标设备&#x…

2024-04-07 作业

作业要求&#xff1a; 1> 思维导图 2> 自由发挥应用场景实现一个登录窗口界面。 【可以是QQ登录界面、也可以是自己发挥的登录界面】 要求&#xff1a;尽量每行代码都有注释 作业1&#xff1a; 作业2&#xff1a; 运行代码&#xff1a; #include "myqwidget.h&quo…

hatch,现代化的 Python 项目管理和打包工具!

目录 前言 安装 特性 基本功能 项目创建 示例代码 虚拟环境管理 依赖管理 测试 打包和发布 高级功能 插件系统 配置环境管理 自定义构建选项 集成测试工具 实际应用场景 多环境管理 持续集成与持续部署&#xff08;CI/CD&#xff09; 项目原型化 依赖与包管理 总结 前言…

Q1剧集市场复盘:2024爱优腾谁在领跑国产剧市场?

2024年Q1剧集市场的成绩单出炉了。 复盘2024年第一季度剧集市场&#xff0c;可以用“生机勃勃”四个字来形容&#xff0c;虽然和去年相比&#xff0c;今年的第一季度缺少了《狂飙》这样的头部大爆款&#xff0c;但市场大盘走势向好。 根据灯塔专业版统计&#xff0c;2024Q1剧…