C#结合SQLite数据库使用方法

一、关于SQLite

SQLite 是一个轻量级的嵌入式关系型数据库管理系统(RDBMS)。与传统的数据库管理系统(如 MySQL、PostgreSQL 或 SQL Server)不同,SQLite 并不需要运行单独的服务器进程,它的数据库存储在一个单一的文件中,因此被称为“嵌入式数据库”。SQLite 常常用于需要小型、快速且无需复杂配置的应用场景。

 SQLite的特点:

1. 轻量级:

   SQLite 是一个非常小的数据库引擎,源代码可以轻松集成到各种应用程序中,适合嵌入式系统和移动应用。其核心库的大小通常只有几百 KB。

2. 零配置:

   与传统的数据库管理系统不同,SQLite 不需要配置服务器、网络连接或管理员权限。它直接通过文件系统进行操作,创建一个单一的数据库文件来存储所有数据。

3. 跨平台支持:

   SQLite 是跨平台的,可以在几乎所有操作系统上运行,包括 Windows、Linux、macOS、iOS、Android 等。它使得开发者能够在不同平台间共享数据。

4. 文件存储:

   所有的数据存储都在一个单一的文件中,这个文件通常很容易复制、备份和移动。

5. 支持标准SQL:

   SQLite 支持 SQL-92 标准的大部分功能,包括查询、事务、触发器、索引等功能,使得开发者可以使用熟悉的 SQL 语法进行数据操作。

6. 事务性:

   SQLite 支持事务,能够确保数据库的操作具有原子性、持久性、一致性和隔离性(ACID 特性)。即使在应用程序崩溃或断电的情况下,数据也能够保持一致性。

7. 无服务器:

   SQLite 是一个无服务器数据库,它直接嵌入到应用程序中。它不需要启动独立的数据库服务器进程,因此启动速度快,资源消耗小。

 使用场景:

1. 移动应用:

   因为 SQLite 轻便且不需要复杂配置,它非常适合用于移动设备(如 Android 和 iOS)的数据存储。

2. 桌面应用:

   在小型桌面应用中,SQLite 是一种理想的数据库解决方案,尤其是那些不需要多个并发用户的应用。

3. Web应用:

   SQLite 也可以作为一些中小型网站的后端数据库,尤其是在开发阶段或低流量的网站中。

4. 物联网(IoT)设备:

   SQLite 常被用在物联网设备中,作为嵌入式数据库存储数据。

 总结:

SQLite 由于其高效、简单、零配置、跨平台的特性,在许多应用场景中都得到了广泛的应用。它对于开发者来说是一款非常方便的工具,尤其适用于嵌入式系统、桌面软件、移动应用等不需要复杂数据库系统的场合。
 

二、常用的sql语句(CRUD)

*. 创建一个新的数据库表

CREATE TABLE IF NOT EXISTS users (
    id INTEGER PRIMARY KEY AUTOINCREMENT,  -- 自动递增的ID
    name TEXT NOT NULL,                    -- 用户名
    age INTEGER NOT NULL                   -- 年龄
);

1. 给数据库中添加数据

### 插入数据

INSERT INTO "表名" (字段1,字段2,字段3...) VALUES(值1,值2,值3...);

### 插入多条数据

INSERT INTO "表名" (字段1,字段2,字段3...) VALUES(值1,值2,值3...),(值1,值2,值3...);

2. 删除数据库中的数据

### 删除特定数据,示例

DELETE FROM users WHERE id = 1;
### 删除所有数据

DELETE FROM users;

3. 查找数据

### 查询所有数据

SELECT * FROM users;
### 查询特定列的数据

SELECT name, age FROM users;
### 查询符合条件的数据

SELECT * FROM users WHERE age > 30;
### 查询单挑数据

SELECT * FROM users WHERE id = 1;

4. 更新数据 

### 更新数据库中某个字段的值为某个值

UPDATE users SET age = 26 WHERE id = 1;

三、用C#代码封装SQLite数据库的各个方法实现增删改查

C#连接SQLite数据库实现增删改查

namespace DB
{public class DataBase{private readonly string _connectionString;// 数据库文件位置private static readonly string databasePath = @"数据库文件路径"; public DataBase(){_connectionString = $"Data Source={databasePath};Version=3;";}/// <summary>/// 打开数据库连接/// </summary>/// <returns>SQLiteConnection 对象</returns>private SQLiteConnection OpenConnection(){var connection = new SQLiteConnection(_connectionString);connection.Open();return connection;}/// <summary>/// 通用方法:执行非查询命令(增、删、改)/// </summary>/// <param name="query">SQL 查询语句</param>/// <param name="parameters">查询参数</param>/// <returns>受影响的行数</returns>public int ExecuteNonQuery(string query, Dictionary<string, object> parameters = null){using var connection = OpenConnection();using var command = new SQLiteCommand(query, connection);// 添加参数if (parameters != null){foreach (var param in parameters){command.Parameters.AddWithValue(param.Key, param.Value);}}return command.ExecuteNonQuery();}/// <summary>/// 通用方法:执行查询并返回结果/// </summary>/// <param name="query">SQL 查询语句</param>/// <param name="parameters">查询参数</param>/// <returns>查询结果 DataTable</returns>public DataTable ExecuteQuery(string query, Dictionary<string, object> parameters = null){using var connection = OpenConnection();using var command = new SQLiteCommand(query, connection);// 添加参数if (parameters != null){foreach (var param in parameters){command.Parameters.AddWithValue(param.Key, param.Value);}}using (var adapter = new SQLiteDataAdapter(command)){var dataTable = new DataTable();adapter.Fill(dataTable);return dataTable;}}/// <summary>/// 增加方法/// </summary>/// <param name="tableName"></param>/// <param name="data"></param>public void Insert(string tableName, Dictionary<string, object> data){var columns = string.Join(", ", data.Keys);var placeholders = string.Join(", ", data.Keys.Select(key => "@" + key));var query = $"INSERT INTO {tableName} ({columns}) VALUES ({placeholders})";            ExecuteNonQuery(query, data);}/// <summary>/// 删除方法/// </summary>/// <param name="tableName"></param>/// <param name="whereClause"></param>/// <param name="parameters"></param>public void Delete(string tableName, string whereClause, Dictionary<string, object> parameters){var query = $"DELETE FROM {tableName} WHERE {whereClause}";ExecuteNonQuery(query, parameters);}/// <summary>/// 查询方法/// </summary>/// <param name="tableName"></param>/// <param name="whereClause"></param>/// <param name="parameters"></param>/// <returns></returns>public DataTable Select(string tableName, string whereClause = null, Dictionary<string, object> parameters = null){var query = $"SELECT * FROM {tableName}";if (!string.IsNullOrEmpty(whereClause)){query += $" WHERE {whereClause}";}return ExecuteQuery(query, parameters);}/// <summary>/// 更新方法/// </summary>/// <param name="tableName"></param>/// <param name="data"></param>/// <param name="whereClause"></param>/// <param name="parameters"></param>public void Update(string tableName, Dictionary<string, object> data, string whereClause, Dictionary<string, object> parameters){// var setClause = string.Join(", ", data.Keys, key => $"{key} = @{key}");var setClause = string.Join(", ", data.Keys.Select(key => $"{key} = @{key}"));var query = $"UPDATE {tableName} SET {setClause} WHERE {whereClause}";// 合并参数if (parameters == null){parameters = new Dictionary<string, object>();}foreach (var param in data){parameters[$"@{param.Key}"] = param.Value;}ExecuteNonQuery(query, parameters);}}
}

创建数据库对象,并进行调用增删查改方法

创建数据库对象

private static readonly DB sqlite = new();

添加数据

给数据库中所有非null值进行赋值。

sqlite.Insert("tabel", new Dictionary<string, object> {{"createTime",DateTime.Now },{ "age",18},{ "name","Peter"},
});

删除数据

删除表中字段为name,并且name为Peter的一条数据。

sqlite.Delete("tabel", "name = @name", new Dictionary<string, object> { { "@name","Peter"  } 
});

查找数据

查找表中的name字段为Peter的全部信息

sqlite.Select("tabel","name = @name", new Dictionary<string, object>
{{"name","Peter" }
});

更新数据

将数据库中name字段为Peter的数据中的age字段改为25.

sqlite.Update(new Dictionary<string, object> { { "age", 25 } },"name = @name",new Dictionary<string, object>{ { "@name","Peter"}
});

四、获取数据库中查询得到的全部数据

查询返回的数据类型为DataTable类型。

DataTable dataTable = sqlite.Select("tabel","name = @name", new Dictionary<string, object>
{{"name","Peter" }
});
foreach (DataRow row in dataTable.Rows)
{Console.WriteLine(row["createTime"]);Console.WriteLine(row["age"]);Console.WriteLine(row["name"]);
}

查询当前条件在数据库中是否有匹配的内容。

DataTable dataTable = sqlite.Select("tabel","name = @name", new Dictionary<string, object>
{{"name","Peter" }
});
if(dataTable.Rows.Count==0) Console.WriteLine("在数据库中没有找到指定内容");

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

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

相关文章

深入解析 MySQL 中的日期时间函数:DATE_FORMAT 与时间查询优化

深入解析 MySQL 中的日期时间函数&#xff1a;DATE_FORMAT 与时间查询优化 在数据库管理和应用开发中&#xff0c;日期和时间的处理是不可或缺的一部分。MySQL 提供了多种日期和时间函数来满足不同的需求&#xff0c;其中DATE_FORMAT函数以其强大的日期格式化能力&#xff0c;…

如何深刻理解Reactor和Proactor

前言&#xff1a; 网络框架的设计离不开 I/O 线程模型&#xff0c;线程模型的优劣直接决定了系统的吞吐量、可扩展性、安全性等。目前主流的网络框架&#xff0c;在网络 IO 处理层面几乎都采用了I/O 多路复用方案(又以epoll为主)&#xff0c;这是服务端应对高并发的性能利器。 …

笔试专题(七)

文章目录 乒乓球筐&#xff08;哈希&#xff09;题解代码 组队竞赛题解代码 删除相邻数字的最大分数&#xff08;线性dp&#xff09;题解代码 乒乓球筐&#xff08;哈希&#xff09; 题目链接 题解 1. 两个哈希表 先统计第一个字符串中的字符个数&#xff0c;再统计第二个字…

清晰易懂的 Flutter 卸载和清理教程

以下是为 Flutter 彻底卸载与清理教程&#xff0c;覆盖 Windows、macOS、Linux 系统&#xff0c;步骤清晰无残留&#xff0c;确保完全删除 Flutter SDK、依赖工具及 IDE 配置。 一、通用步骤&#xff1a;确认 Flutter 安装方式 Flutter 通常通过以下方式安装&#xff1a; 手动…

关于反卷积

&#x1f9e0; 什么是反卷积&#xff1f; 反卷积&#xff08;Deconvolution&#xff09;&#xff0c;通常也称为转置卷积&#xff08;Transpose Convolution&#xff09;&#xff0c;是一种用于扩展输入特征图的操作&#xff0c;通常用于生成图像或上采样任务中。与标准卷积操…

【机器学习】ROC 曲线与 PR 曲线

目录 一、混淆矩阵&#xff1a;分类评估的基础 二. ROC 曲线 (Receiver Operating Characteristic Curve) 三. PR 曲线 (Precision-Recall Curve) 3.1 核心思想 4. 何时使用 ROC 曲线和 PR 曲线&#xff1f; 实验结果 6. 总结 在机器学习的分类任务中&#xff0c;我们训…

Python高阶函数-map

map() 是 Python 内置的一个高阶函数&#xff0c;它接收一个函数和一个可迭代对象作为参数&#xff0c;将函数依次作用在可迭代对象的每个元素上&#xff0c;并返回一个迭代器&#xff08;Python 3.x 中&#xff09;。 基本语法 map(function, iterable, ...)function: 应用于…

上海餐饮市场数据分析与可视化

上海作为中国的经济中心和国际化大都市,其餐饮市场具有高度的多样性和竞争性。随着消费者需求的不断变化,餐饮行业的从业者和投资者需要深入了解市场现状和趋势,以便制定更有效的商业策略。本文将通过数据分析和可视化技术,深入探讨上海餐饮市场的现状和趋势,为餐饮从业者…

MySQL基础 [五] - 表的增删查改

目录 Create&#xff08;insert&#xff09; Retrieve&#xff08;select&#xff09; where条件 ​编辑 NULL的查询 结果排序(order by) 筛选分页结果 (limit) Update Delete 删除表 截断表&#xff08;truncate&#xff09; 插入查询结果&#xff08;insertselect&…

SQL:Primary Key(主键)和Foreign Key(外键)

目录 1. Key&#xff08;键&#xff09; 2. Index&#xff08;索引&#xff09; 3.Key和Index的区别 4. Primary Key&#xff08;主键&#xff09; 5. Foreign Key&#xff08;外键&#xff09; 6.主键和外键的关系 温馨提示&#xff1a; 闪电按钮不同的执行功能 首先&…

2025年- H1-Lc109-160. 相交列表--java版

1.题目描述 2.思路 “双指针切换链表头” 思路一&#xff1a;双指针路径对齐 while (pA ! pB) { pA (pA null) ? headB : pA.next; pB (pB null) ? headA : pB.next; } 让两个指针走相同的总路径长度&#xff01; 设&#xff1a; 链表 A 独有部分长度是 lenA 链表 B …

PyTorch 深度学习 || 6. Transformer | Ch6.3 Transformer 简单案例

1. 简单案例 这个代码是一个简单的 Transformer 模型的实现,这个例子展示了一个基本的序列到序列(seq2seq)任务,比如将一个数字序列转换为另一个数字序列。可以用于学习和理解 Transformer 的基本结构和工作原理。 import torch import torch.nn as nn import math# 位置…

基础算法篇(4)(蓝桥杯常考点)—数据结构(进阶)

前言 这期将会讲到基础算法篇里面的数据结构&#xff08;进阶&#xff09;&#xff0c;主要包括单调栈&#xff0c;单调队列&#xff0c;并查集&#xff0c;扩展域并查集&#xff0c;带权并查集&#xff0c;字符串哈希&#xff0c;Trie树。 数据结构(进阶&#xff09;正文 单…

【AI学习】初步了解Gradio

Gradio 是一个开源的 Python 库&#xff0c;专注于快速构建交互式 Web 界面&#xff0c;特别适用于机器学习模型、数据科学项目或任意 Python 函数的演示与部署。它通过极简的代码实现前后端一体化&#xff0c;无需前端开发经验即可创建功能丰富的应用。以下是 Gradio 的核心特…

Overleaf 论文提交 Arxiv

Contents References 清除 Overleaf 中所有编译 error&#xff0c;并且保证 main.tex 文件在 project 最上层参考文件 .bib 转 .bbl. project 编译成功后可以在 Overleaf 的 Recompile 按钮右侧找到 “Logs and output files”&#xff0c;点进去之后右下角可以点开 “Other lo…

【Android Audio】Parameter Framework - pfw

Parameter Framework - Android AudioPolicy Engine 使用 libengineconfigurable.so 来取缔默认安卓音频引擎 libenginedefault.so&#xff0c;因为默认安卓音频引擎是通过代码来决定策略&#xff0c;然而 libengineconfigurable 采用读取pfw类型的文件来实现音频策略配置。 …

服务器虚拟化技术深度解析:医药流通行业IT架构优化指南

一、服务器虚拟化的定义与原理 &#xff08;一&#xff09;技术定义&#xff1a;从物理到虚拟的资源重构 服务器虚拟化是通过软件层&#xff08;Hypervisor&#xff09;将物理服务器的CPU、内存、存储、网络等硬件资源抽象为逻辑资源池&#xff0c;分割成多个相互隔离的虚拟机…

babel-runtime 如何缩小打包体积

&#x1f916; 作者简介&#xff1a;水煮白菜王&#xff0c;一位前端劝退师 &#x1f47b; &#x1f440; 文章专栏&#xff1a; 前端专栏 &#xff0c;记录一下平时在博客写作中&#xff0c;总结出的一些开发技巧和知识归纳总结✍。 感谢支持&#x1f495;&#x1f495;&#…

剑指Offer(数据结构与算法面试题精讲)C++版——day7

剑指Offer&#xff08;数据结构与算法面试题精讲&#xff09;C版——day7 题目一&#xff1a;最多删除一个字符得到回文题目二&#xff1a;回文子字符串的个数题目三&#xff1a;删除倒数第k个节点 题目一&#xff1a;最多删除一个字符得到回文 这里我们可以在经典的字符串回文…

2025年常见渗透测试面试题(题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 常见面试题 一、渗透测试经历与技术复盘 二、高频漏洞类型与攻防体系 三、渗透工具链与技术特性 四、…