C语言实例_调用SQLITE数据库完成数据增删改查

一、SQLite介绍

SQLite是一种轻量级的关系型数据库管理系统(RDBMS),它是一个开源的、零配置的、服务器端的、自包含的、零管理的、事务性的SQL数据库引擎。它被广泛应用于嵌入式设备、移动设备和桌面应用程序等领域。

SQLite的特点包括:

(1)轻量级:SQLite的核心库只有几百KB,非常适合在嵌入式设备、移动设备等资源受限的环境中使用。

(2)零配置:SQLite不需要任何配置,只需要将库文件嵌入到应用程序中即可。

(3)服务器端:SQLite不需要运行在服务器上,所有的数据都存储在本地文件中。

(4)自包含:SQLite的所有功能都包含在一个单独的库文件中,不需要依赖其他库文件。

(5)零管理:SQLite不需要维护数据库的连接、事务等状态,所有的操作都是自动的。

(6)事务性:SQLite支持ACID事务,保证数据的一致性和可靠性。

SQLite支持标准的SQL语句,包括SELECT、INSERT、UPDATE、DELETE等操作,同时还支持多种数据类型,包括整数、浮点数、字符串、日期等。SQLite还支持多种编程语言,包括C、C++、Python、Java等,可以方便地集成到各种应用程序中。

在这里插入图片描述

在 Windows 系统下,可以按照以下步骤下载和安装 SQLite 数据库:

(1)打开 SQLite 官方网站:https://www.sqlite.org/index.html

(2)在网站顶部的菜单栏中,点击 “Downloads” 进入下载页面。
在这里插入图片描述

(3)在下载页面中,你会看到一些可用的预编译二进制文件。根据你的 Windows 操作系统位数(32位或64位)和需求选择适当的版本。

(4)对于 32 位系统,可以在 "Precompiled Binaries for Windows" 部分直接下载 sqlite-dll-win32-x86-*.zipsqlite-tools-win32-x86-*.zip 文件。

(5)对于 64 位系统,可以在 "Precompiled Binaries for Windows" 部分直接下载 sqlite-dll-win64-x64-*.zipsqlite-tools-win64-x64-*.zip 文件。

(6)下载完成后,解压缩 sqlite-dll-win*.zip 文件得到 sqlite3.dll 文件。

(7)创建一个文件夹(命名为 SQLite 或其他喜欢的名称),将 sqlite3.dll 文件拷贝到该文件夹中。

(8)接下来,解压缩 sqlite-tools-win*.zip 文件得到一组工具文件,包括 sqlite3.exe,sqlite3_analyzer.exe 和 sqlite3.def 文件。

(8)将这些工具文件也拷贝到之前创建的 SQLite 文件夹中。

二、SQLite语法

SQLite是一个轻量级的嵌入式数据库,支持标准SQL语法。

下面逐一介绍SQLite数据库的创建表、插入数据、删除数据、更新数据和查询数据的语法:

(1)创建表
要在SQLite数据库中创建表,可以使用CREATE TABLE语句。语法如下:

CREATE TABLE table_name (column1 datatype constraint,column2 datatype constraint,...
);

table_name 是所要创建的表的名称

column1, column2等是表的列名

datatype 是列的数据类型

constraint 是可选项,用于定义列约束条件,比如主键、唯一约束、外键等。

例如,创建一个名为 “students” 的表,包含id、name和age三个列:

CREATE TABLE students (id INTEGER PRIMARY KEY,name TEXT,age INTEGER
);

(2)插入数据
要向SQLite数据库中的表插入数据,可以使用INSERT INTO语句。语法如下:

INSERT INTO table_name (column1, column2, ...)
VALUES (value1, value2, ...);

table_name 是要插入数据的表的名称。

column1, column2等是表的列名。

value1, value2等是要插入的具体数值。

例如,向 “students” 表中插入一条数据:

INSERT INTO students (id, name, age) VALUES (1, '张三', 20);

(3)删除数据
要从SQLite数据库中的表删除数据,可以使用DELETE FROM语句。语法如下:

DELETE FROM table_name
WHERE condition;
table_name 是要删除数据的表的名称。

condition 是可选项,用于指定删除数据的条件。

例如,从 “students” 表中删除 id 为 1 的数据:

DELETE FROM students WHERE id = 1;

(4)更新数据
要更新SQLite数据库表中的数据,可以使用UPDATE语句。语法如下:

UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;

table_name 是要更新数据的表的名称。

column1, column2等是要更新的列名。

value1, value2等是要更新的具体数值。

condition 是可选项,用于指定更新数据的条件。

例如,将 “students” 表中 id 为 1 的数据的 name 更新为 ‘李四’,age 更新为 22:

UPDATE students SET name = '李四', age = 22 WHERE id = 1;

(5)查询数据
要从SQLite数据库表中查询数据,可以使用SELECT语句。语法如下:

SELECT column1, column2, …
FROM table_name
WHERE condition;
column1, column2等是要查询的列名,如果要查询所有列,可以使用 * 符号代替。

table_name 是要查询数据的表的名称。

condition 是可选项,用于指定查询数据的条件。

例如,从 “students” 表中查询所有数据

SELECT * FROM students;

三、完整代码
下面C语言代码,演示如何使用SQLite数据库:

#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>// 数据库文件名
const char* DB_FILE = "example.db";// 回调函数,用于执行查询sql语句后的结果处理
int selectCallback(void* data, int argc, char** argv, char** azColName)
{int i;for (i = 0; i < argc; i++){printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");}printf("\n");return 0;
}// 初始化数据库连接
sqlite3* initDatabase()
{sqlite3* db;int rc = sqlite3_open(DB_FILE, &db);if (rc != SQLITE_OK){fprintf(stderr, "无法打开数据库: %s\n", sqlite3_errmsg(db));sqlite3_close(db);return NULL;}return db;
}// 关闭数据库连接
void closeDatabase(sqlite3* db)
{if (db){sqlite3_close(db);}
}// 创建表
void createTable(sqlite3* db)
{char* errMsg;const char* createSql = "CREATE TABLE IF NOT EXISTS students (id INT PRIMARY KEY, name TEXT, age INT);";int rc = sqlite3_exec(db, createSql, NULL, 0, &errMsg);if (rc != SQLITE_OK){fprintf(stderr, "无法创建表: %s\n", errMsg);sqlite3_free(errMsg);}else{printf("表创建成功\n");}
}// 插入数据
void insertData(sqlite3* db, int id, const char* name, int age)
{char insertSql[100];snprintf(insertSql, sizeof(insertSql), "INSERT INTO students (id, name, age) VALUES (%d, '%s', %d);", id, name, age);char* errMsg;int rc = sqlite3_exec(db, insertSql, NULL, 0, &errMsg);if (rc != SQLITE_OK){fprintf(stderr, "无法插入数据: %s\n", errMsg);sqlite3_free(errMsg);}else{printf("数据插入成功\n");}
}// 更新数据
void updateData(sqlite3* db, int id, const char* name, int age)
{char updateSql[100];snprintf(updateSql, sizeof(updateSql), "UPDATE students SET name = '%s', age = %d WHERE id = %d;", name, age, id);char* errMsg;int rc = sqlite3_exec(db, updateSql, NULL, 0, &errMsg);if (rc != SQLITE_OK){fprintf(stderr, "无法更新数据: %s\n", errMsg);sqlite3_free(errMsg);}else{printf("数据更新成功\n");}
}// 删除数据
void deleteData(sqlite3* db, int id)
{char deleteSql[100];snprintf(deleteSql, sizeof(deleteSql), "DELETE FROM students WHERE id = %d;", id);char* errMsg;int rc = sqlite3_exec(db, deleteSql, NULL, 0, &errMsg);if (rc != SQLITE_OK){fprintf(stderr, "无法删除数据: %s\n", errMsg);sqlite3_free(errMsg);}else{printf("数据删除成功\n");}
}// 查询数据
void selectData(sqlite3* db)
{char* errMsg;const char* selectSql = "SELECT * FROM students;";int rc = sqlite3_exec(db, selectSql, selectCallback, 0, &errMsg);if (rc != SQLITE_OK){fprintf(stderr, "无法查询数据: %s\n", errMsg);sqlite3_free(errMsg);}
}int main()
{sqlite3* db = initDatabase();if (db){createTable(db);insertData(db, 1, "张三", 20);insertData(db, 2, "李四", 22);insertData(db, 3, "王五", 25);selectData(db);updateData(db, 1, "赵六", 23);selectData(db);deleteData(db, 3);selectData(db);closeDatabase(db);}return 0;
}

在这个示例中,通过 initDatabase 函数初始化数据库连接,通过 createTable 函数创建一个名为 “students” 的表。然后使用 insertData 函数插入数据,updateData 函数更新数据,deleteData 函数删除数据,selectData 函数查询数据,并通过 selectCallback 回调函数处理查询结果。

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

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

相关文章

【Java 进阶篇】MySQL启动与关闭、目录结构以及 SQL 相关概念

MySQL 服务启动与关闭 MySQL是一个常用的关系型数据库管理系统&#xff0c;通过启动和关闭MySQL服务&#xff0c;可以控制数据库的运行状态。本节将介绍如何在Windows和Linux系统上启动和关闭MySQL服务。 在Windows上启动和关闭MySQL服务 启动MySQL服务 在Windows上&#x…

掌动智能:替代JMeter的压力测试工具有哪些

JMeter是一个广泛使用的开源压力测试工具&#xff0c;但在实际应用中&#xff0c;也有一些其他优秀的替代品可供选择。本文将介绍几个可替代JMeter的压力测试工具&#xff0c;它们在功能、性能和易用性方面都具有独特优势&#xff0c;可以满足不同压力测试需求的选择。 一、Gat…

[Linux]线程互斥

[Linux]线程互斥 文章目录 [Linux]线程互斥线程并发访问问题线程互斥控制--加锁pthread_mutex_init函数pthread_mutex_destroy函数pthread_mutex_lock函数pthread_mutex_unlock函数锁相关函数使用示例使用锁的细节加锁解锁的实现原理 线程安全概念常见的线程不安全的情况常见的…

OpenCV之分水岭算法(watershed)

Opencv 中 watershed函数原型&#xff1a; void watershed( InputArray image, InputOutputArray markers ); 第一个参数 image&#xff0c;必须是一个8bit 3通道彩色图像矩阵序列&#xff0c;第一个参数没什么要说的。关键是第二个参数 markers&#xff0c;Opencv官方文档的说…

使用 Ruby 语言来解析开放文档格式 OOXML 文件

在这篇文章中&#xff0c;我们将了解一个开发团队如何解决他们在应用程序中解析数据时遇到的问题。 为了测试 ONLYOFFICE 文档编辑器&#xff0c;我们用Ruby语言开发编写了个docx、xlsx、pptx文件解析器程序&#xff0c;它是免费开源的&#xff0c;被我们放在GitHub和RubyGems…

【一】初步认识数据库

数据库概览数据库 缘起表(Table)的理解用表来定义数据库数据库系统的理解概念层次的理解实例层次的理解 数据库管理系统的理解从用户角度看从系统实现角度看典型的数据库管理系统 数据库语言数据库定义、操纵、控制语言数据库语言 VS 高级语言 内容回顾练习 数据库概览 走马观…

安卓玩机-----给app加注册码 app加弹窗 云注入弹窗

在对接很多工作室业务中有些客户需要在他们自带的有些app中加注册码或者验证码的需求。其实操作起来也很简单。很多反编译软件有自带的注入功能。例如注入弹窗。这个是需要对应的注册码来启动应用。而且是随机id。重新安装app后需要重新注册才可以继续使用&#xff0c;原则上可…

深入学习git

1、git原理及整体架构图 一些常用的命令 git add . 或 git add src/com/ygl/hello/hello.java 指定文件 git commit . 或 git commit src/com/ygl/hello/hello.java 指定文件 git push origin 分支名称 2、git stash的应用场景 场景一&#xff1a;你正在当前分支A开发&…

localStorage实现历史记录搜索功能

&#x1f4dd;个人主页&#xff1a;爱吃炫迈 &#x1f48c;系列专栏&#xff1a;JavaScript &#x1f9d1;‍&#x1f4bb;座右铭&#xff1a;道阻且长&#xff0c;行则将至&#x1f497; 文章目录 为什么使用localStorage如何使用localStorage实现历史记录搜索功能&#xff08…

代码随想录算法训练营第五十二天 | 300. 最长递增子序列 674. 最长连续递增序列 718. 最长重复子数组

1. 最长递增子序列 300. 最长递增子序列 - 力扣&#xff08;LeetCode&#xff09; dp[i] 取决于 i 之前所有的dp class Solution {public int lengthOfLIS(int[] nums) {// dp[i] 第 0 - i 位的递增子序列长度int length nums.length;int[] dp new int[length];Arrays.fil…

基于SSM的微博系统网站的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用Vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

如何用ChatGPT学或教英文?5个使用ChatGPT的应用场景!

原文&#xff1a;百度安全验证 AI工具ChatGPT的出现大幅改变许多领域的运作方式&#xff0c;就连「学英文」也不例外&#xff01;我发现ChatGPT应用在英语的学习与教学上非常有意思。 究竟ChatGPT如何改变英文学习者(学生)与教学者(老师)呢&#xff1f; 有5个应用场景我感到…

2023-09-28 monetdb-databae的概念和作用-分析

摘要: 每个数据库对于db,schema以及user,role都有一套自己的设计, 不同数据库间对于相同名字的东西例如database和schema可以说南辕北辙, 例如mysql中schema其实是database的同义词. 本文分析monetdb的database的概念和作用 database的概念和作用: 和mysql的database完全不同…

Linux开发工具之文本编译器vim

目录 Linux编辑器-vim使用 1. vim的基本概念 ● 正常/普通/命令模式(Normal mode) ● 插入模式(Insert mode) ● 末行模式(last line mode) 2. vim的基本操作 ● [正常模式]切换至[插入模式] ● [插入模式]切换至[正常模式] ● [正常模式]切换至[末行模式] ● 退出vi…

步力宝科技爆款产品定位,开创智能物联网新商业

数据显示&#xff0c;中国处于 “亚健康”状态人口数量约占总人口的70%&#xff0c;亚健康是一种临界状态&#xff0c;指介于健康和疾病之间的状态。亚健康是一个动态演变的过程&#xff0c;既有向慢病发展的趋势&#xff0c;也能通过合理的干预使人体重返健康状态&#xff0c;…

网络运营和电子商务有什么区别

大家好&#xff0c;我是网络工程师成长日记实验室的郑老师&#xff0c;您现在正在查看的是网络工程师成长日记专栏&#xff0c;记录网络工程师日常生活的点点滴滴 一个同学他问我&#xff0c;他说学网络运营的话&#xff0c;它是不是电子商务里面的这个东西&#xff1f;像电子大…

南京大学【软件分析】08 Pointer Analysis

文章目录 1. Motivation2. Introduction to Pointer Analysis3. Key Factors of Pointer Analysis3.1 Heap Abstraction3.2 Context Sensitivity3.3 Flow sensitivity3.4 Analysis scope 4. Concerned Statements 1. Motivation 指针分析存在不精确的问题。对于下面的例子&…

快排三种递归及其优化,非递归和三路划分

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 目录 快排简介&#xff1a; 快排的三种递归实现&#xff1a; Hoare&#xff1a; 挖坑&#xff1a; 双指针&#xff1a; 小区间优化&#xff1a; 三数取中优化&#xff1a; 快排非递归实现&#xff1a; 快排的三路划…

Ubuntu配置深度学习环境(TensorFlow和pyTorch)

文章目录 一、CUDA安装1.1 安装显卡驱动1.2 CUDA安装1.3 安装cuDNN 二、Anaconda安装三、安装TensorFlow和pyTorch3.1 安装pyTorch3.2 安装TensorFlow2 四、安装pyCharm4.1 pyCharm的安装4.2 关联anaconda的Python解释器 五、VScode配置anaconda的Python虚拟环境 前言&#xff…

一维数组和二维数组的使用(char类型)

目录 导读1. 字符数组1.1 字符数组的创建1.2 字符数组的初始化1.3 不同初始化在内存中的不同1.3.1 strlen测试1.3.2 sizeof测试1.3.3 差异原因 1.4 字符数组的使用 2. 数组越界3. 数组作为函数参数博主有话说 导读 我们在前面讲到了 int 类型的数组的创建和使用&#xff1a; 一…