linux学习——数据库API创建

一.API操作

1.int sqlite3_open(char *filename,sqlite3 **db)
        功能:打开sqlite数据库
        参数:
                filename:数据库文件路径
                db:指向sqlite句柄的指针 (splite3* db;)
        返回值:
                成功返回0,失败返回错误码(非0值)

                成功返回SQLITE_OK


2.int sqlite3_close(sqlite3 *db);
        功能:关闭sqlite数据库
        参数:
                db 操作数据库的指针
        返回值:
                成功返回0,失败返回错误码
3.const char *sqlite3_errmsg(sqlite3 *db);
        功能:通过DB句柄得到数据库操作的错误信息
        参数:
                db 操作数据库的指针
        返回值:
                返回错误信息的首地址

4.int sqlite3_exec(

                                  sqlite3*db,

                                  const char *sql,
                                  int (*callback)(void *,int,char**,char *8)
                                  void *,
                                 char **errmsg);

                        功能:执行一条sql语句
        参数
                db:数据库操作句柄
                sql:一条sql语句
                callback:回调函数,只有sql为查询语句的时候,
                        才会执行此语句
                void * :给回调函数传递参数
                errmsg:错误信息
        返回值:
                成功:SQLITE_OK


int (*callback)(void *,int,char**,char *8)
功能:查询结果,是一个函数指针类型,传递一个函数名

用到第三方库需要 -lsqlite3

回调函数接口:
typedef int(*sqlite3_callback)(
                                                void *para,
                                                int f_num,
                                                char ** f_value,
                                                char ** f_name)
        功能: 每找到一条记录自动执行一次回调函数
                para:传递给回调函数的参数
                f_num:记录中包含的字段数目
                f_value:包含每个字段值的指针数组
                f_name:包含每个字段名称的指针数组
        返回值

                成功返回0,失败返回-1

int callback(void *para,int f_num,char **f_value,char **f_name)
{int i=0;for(i=0;i<f_num;i++){printf("%s",f_value[i]);}putchar(10);return 0;
}
int do_query(sqlite3 *db)
{char sql[128]={0};char *errmsg;sprintf(sql,"select * from stu");if(sqlite3_exec(db,sql,callback,NULL,&errmsg) !=SQLITE_OK){printf("%s\n",errmsg);exit(0);}else{printf("query success\n");}return 0;
}

不使用回调函数执行SQL语句
int sqlite3_get_table(
                                        sqlite3 *db,
                                        const char *sql,
                                        char ***resultp,
                                        int *nrow, // 相当于行
                                        int *ncolumu,//列
                                        char **errmsg)

功能:执行sql操作
        db:数据库句柄
        sql:sql语句
        resultp:用来指向sql执行结果的指针
        nrow:满足条件的记录的数目
        ncolumn:每条记录包含的字段数目
        errmsg:错误信息指针的地址
返回值:

        成功返回0,失败返回错误码

这是没有打印抬头的

int  do_query2(sqlite3 *db)
{char sql[128] ={};char *errmsg;char **resultp;int nrow;int ncloumn;int i,j,index;sprintf(sql,"select * from stu");if(sqlite3_get_table(db,sql,&resultp,&nrow,&ncloumn,&errmsg) !=SQLITE_OK){printf("%s",errmsg);}else{printf("query success\n");}index =ncloumn;for(i=0;i<nrow;i++){for(j=0;j<ncloumn;j++){printf("%-11s",resultp[index++]);}putchar(10);}
}

加上代码之后

 for(j=0;j<ncloumn;j++){printf("%-11s",resultp[j]);}putchar(10);

数据库API创建的全部代码

#include<stdio.h>
#include<stdlib.h>
#include <sqlite3.h>#define DATABASE "student.db"
int do_insert(sqlite3 *db)
{int id;char name[32]={0};int score;char sql[128]={0};char* errmsg;printf("please input id:");scanf("%d",&id);getchar();printf("please input name:");scanf("%s",name);getchar();printf("please input score:");scanf("%d",&score);getchar();sprintf(sql,"insert into stu values(%d,'%s',%d);",id,name,score);if(sqlite3_exec(db,sql,NULL,NULL,&errmsg) !=SQLITE_OK){printf("%s\n",errmsg);exit(0);}else{printf("insert success\n");}return 0;
}
int do_delete(sqlite3 *db)
{int id;char sql[128]={0};char *errmsg;printf("please input id:");scanf("%d",&id);getchar();sprintf(sql,"delete from stu where id=%d;",id);if(sqlite3_exec(db,sql,NULL,NULL,&errmsg) !=SQLITE_OK){printf("%s\n",errmsg);exit(0);}else{printf("delete success\n");}return 0;
}
int do_update(sqlite3 *db)
{int id;char sql[128] ={0};int score;char *errmsg;printf("please input id:");scanf("%d",&id);getchar();printf("please input score:");scanf("%d",&score);getchar();sprintf(sql,"update stu set score =%d where id=%d;",score,id);if(sqlite3_exec(db,sql,NULL,NULL,&errmsg)  !=SQLITE_OK){printf("%s\n",errmsg);exit(0);}else{printf("update success\n");}return 0;
}
int callback(void *para,int f_num,char **f_value,char **f_name)
{int i=0;for(i=0;i<f_num;i++){printf("%s",f_value[i]);}putchar(10);return 0;
}
int do_query1(sqlite3 *db)
{char sql[128]={0};char *errmsg;sprintf(sql,"select * from stu");if(sqlite3_exec(db,sql,callback,NULL,&errmsg) !=SQLITE_OK){printf("%s\n",errmsg);exit(0);}else{printf("query success\n");}return 0;
}
int  do_query2(sqlite3 *db)
{char sql[128] ={};char *errmsg;char **resultp;int nrow;int ncloumn;int i,j,index;sprintf(sql,"select * from stu");if(sqlite3_get_table(db,sql,&resultp,&nrow,&ncloumn,&errmsg) !=SQLITE_OK){printf("%s",errmsg);}else{printf("query success\n");}index =ncloumn;for(j=0;j<ncloumn;j++){printf("%-11s",resultp[j]);}putchar(10);for(i=0;i<nrow;i++){for(j=0;j<ncloumn;j++){printf("%-11s",resultp[index++]);}putchar(10);}
}
int main()
{char *errmsg;sqlite3* db;int cmd;if(sqlite3_open(DATABASE,&db) !=SQLITE_OK){printf("%s\n",sqlite3_errmsg(db));exit(1);}else{printf("open slite3 success\n");}if(sqlite3_exec(db,"create table stu(id Integer,name char,score Integer);",NULL,NULL,&errmsg) !=SQLITE_OK){printf("%s\n",sqlite3_errmsg(db));exit(1);}else{printf("create or open table success\n");}while(1){printf("*********************\n");printf("1:insert,2:delete,3:quert,4:update,5:quit\n");printf("*********************\n");printf("please input cmd\n");scanf("%d",&cmd);getchar();switch(cmd){case 1:do_insert(db);break;case 2:do_delete(db);break;case 3:do_query2(db);break;case 4:do_update(db);break;case 5:sqlite3_close(db);exit(0);break;case 6:printf("err cmd\n");}}return 0;
}


 

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

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

相关文章

Baklib内容中台落地实战指南

内容中台实施最佳路径 在构建企业级内容中台的实践中&#xff0c;架构设计与流程优化构成核心支撑框架。通过四库体系&#xff08;知识库、资源库、模板库、场景库&#xff09;的有机组合&#xff0c;企业可实现从知识沉淀到场景化应用的闭环管理。智能检索技术结合语义分析引…

【重走C++学习之路】26、类型转换

目录 一、C语言中的类型转换 二、C中的四个类型转换 2.1 static_cast 2.2 dynamic_cast 2.3 const_cast 2.4 reinterpret_cast 2.5 总结 结语 一、C语言中的类型转换 在C语言中&#xff0c;如果赋值运算符左右两侧类型不同&#xff0c;或者形参与实参类型不匹配&a…

kotlin 过滤 filter 函数的作用和使用场景

1. filter 函数的作用 filter 是 Kotlin 集合操作中的一个高阶函数&#xff0c;用于根据指定条件从集合中筛选出符合条件的元素。 作用&#xff1a;遍历集合中的每个元素&#xff0c;并通过给定的 lambda 表达式判断是否保留该元素。返回值&#xff1a;一个新的集合&#xff…

安卓程序打包与发布

一 配置编译信息 二 创建密钥

LeetCode算法题 (移除链表元素)Day15!!!C/C++

https://leetcode.cn/problems/remove-linked-list-elements/description/ 一、题目分析 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 今天的题目非常好理解&#xff0c;也就是要删除…

Scrapy框架之【Scrapy-Redis】分布式爬虫详解

Scrapy-Redis 介绍 Scrapy-Redis 是一个基于 Redis 实现的 Scrapy 分布式爬虫组件。Scrapy 本身是一个强大的 Python爬虫框架&#xff0c;但它默认是单进程单线程的&#xff0c;在面对大规模数据抓取任务时效率不高。Scrapy-Redis 则解决了这一问题&#xff0c;它允许你将 Scra…

Gradio全解20——Streaming:流式传输的多媒体应用(3)——实时语音识别技术

Gradio全解20——Streaming&#xff1a;流式传输的多媒体应用&#xff08;3&#xff09;——实时语音识别技术 本篇摘要20. Streaming&#xff1a;流式传输的多媒体应用20.3 实时语音识别技术20.3.1 环境准备和开发步骤1. 环境准备2. ASR应用开发步骤&#xff08;基于Transform…

使用xlwings将两张顺序错乱的表格进行数据核对

有如下一个excel表&#xff0c;姓名列的内容相同&#xff0c;顺序不同&#xff1b;月薪有部分内容不同。 目的&#xff1a;要找出哪几条月薪不同。 通常的做法&#xff0c;要使用excel的高级筛选。 在此&#xff0c;使用xlwings实现&#xff0c;在不同的内容上涂色。 代码如…

2025大模型安全研究十大框架合集(10份)

2025大模型安全研究十大框架合集的详细介绍&#xff1a; Anthropic AI信任研究框架 Anthropic于2024年10月更新的《安全责任扩展政策》(RSP)&#xff0c;提出了一个灵活的动态AI风险治理框架。该框架规定当AI模型达到特定能力时&#xff0c;将自动升级安全措施&#xff0c;如…

Qt/C++开发监控GB28181系统/云台控制/获取预置位信息/添加删除调用预置位

一、前言 之前用onvif已经完美实现了设备的云台控制和预置位的功能&#xff0c;这个基础功能在监控系统中是使用频率很高的&#xff0c;所有gb28181肯定也提供了这样的功能&#xff0c;很多人以为是通过包含xml数据&#xff0c;对应节点指定对应的动作来实现&#xff0c;其实不…

第T8周:猫狗识别

● 语言环境&#xff1a;Python3.8.8 ● 编译器&#xff1a;Jupyter Lab ● 深度学习环境&#xff1a;TensorFlow2.4.1 猫狗识别 一、前期工作1. 设置GPU 二、数据预处理1. 加载数据2.再次检查数据3.配置数据集 三、构建VG-16网络四、编译五、训练模型六、模型评估七、预测八、…

主流微前端框架比较

主流微前端框架比较 以下表格列出了当前主流微前端框架的核心对比信息,包括基本介绍、核心特性、适用场景、技术栈兼容性、优缺点、社区维护情况和典型应用案例等: 框架基本介绍核心特性与机制适用场景技术栈兼容性优缺点社区维护情况典型应用案例qiankun蚂蚁金服推出的生产…

大学生入学审核系统设计与实现【基于SpringBoot + Vue 前后端分离技术】

一、项目概述 1.1 项目背景 随着高校的不断扩招&#xff0c;传统的入学审核管理模式已不能满足大规模学生数据的处理需求。人工管理不仅效率低下&#xff0c;还容易出现疏漏。本系统通过信息化手段&#xff0c;提升入学审核过程中的数据管理和审批效率。 1.2 系统目标 系统…

云计算-容器云-服务网格Bookinfo

服务网格&#xff1a;创建 Ingress Gateway 将 Bookinfo 应用部署到 default 命名空间下&#xff0c;请为 Bookinfo 应用创建一个网 关&#xff0c;使外部可以访问 Bookinfo 应用。 上传ServiceMesh.tar.gz包 [rootk8s-master-node1 ~]# tar -zxvf ServiceMesh.tar.gz [rootk…

Spring 分批处理 + 冷热数据分离:历史订单高效迁移与数据清理实战

在实际业务中&#xff0c;随着时间推移&#xff0c;订单量持续增长&#xff0c;若未及时进行数据治理&#xff0c;会造成数据库膨胀、查询缓慢、性能下降等问题。为了实现数据分层管理和系统高性能运行&#xff0c;我们在项目中采用了“冷热数据分离 分批迁移 数据清理”的综…

新手SEO优化核心步骤

内容概要 对于SEO新手而言&#xff0c;建立系统化的优化框架是突破入门瓶颈的关键。SEO的核心在于通过技术手段与内容策略的结合&#xff0c;提升网站在搜索引擎中的可见性与用户价值。具体而言&#xff0c;新手需优先掌握关键词研究&#xff0c;明确目标用户的搜索意图&#…

C++ 之 【list的简介、list 的构造函数、iterator、容量操作、元素访问、增删查改与迭代器失效】

目录 1.list的介绍 2.list的使用 2.1 构造函数 2.2 iterator 的使用 2.3 容量操作 2.4 元素访问 2.5 增删查改 2.5.1头插头删与尾插尾删 2.5.2 insert 、erase 函数 2.5.3 clear、swap函数 2.5.4 关于find函数 3.迭代器失效 1.list的介绍 (1)list的底层通常实现为带…

Laravel Octane 项目加速与静态资源优化指南

Laravel Octane 项目加速与静态资源优化指南 一、Octane 核心加速配置 扩展安装与环境配置 composer require laravel/octane # 安装核心扩展‌php artisan octane:install # 生成配置文件&#xff08;选择 Swoole/RoadRunner 等服务器&#xff09;‌服务器参数调优‌ …

高露洁牙膏是哪个国家的品牌?高露洁牙膏哪一款最好?

高露洁是来自于美国一个比较有知名度的品牌&#xff0c;在1806年的时候创立。总部是在美国纽约公园大道&#xff0c;在1873年时&#xff0c;高露洁就已经开始销售罐装牙膏。 在1896年时期推出可折叠管牙膏&#xff0c;在口腔护理产品发展的过程中拥有着不容忽视的地位。在1992…

【Python爬虫详解】第八篇:突破反爬体系的工程实践

当矛与盾的较量进入白热化&#xff0c;突破反爬需要的不只是技巧&#xff0c;更是一套完整的工程化解决方案——本文将揭示对抗现代反爬体系的九大核心战术。 一、JavaScript混淆的深度破解 1. AST&#xff08;抽象语法树&#xff09;解混淆 案例&#xff1a;某电商平台商品价…