关于C#操作SQLite数据库的一些函数封装

主要功能:增删改查、自定义SQL执行、批量执行(事务)、防SQL注入、异常处理


1.NuGet中安装System.Data.SQLite


2.SQLiteHelper的封装:
using System;
using System.Collections.Generic;
using System.Data.SQLite;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Security.Cryptography;namespace inventory_management_system.jdbc
{public class SQLiteHelper{private SQLiteConnection _connection;public SQLiteHelper(string databasePath){_connection = new SQLiteConnection($"Data Source={databasePath};Version=3;BinaryGUID=False;");}public void OpenConnection(){if (_connection.State != ConnectionState.Open){_connection.Open();}}public void CloseConnection(){if (_connection.State != ConnectionState.Closed){_connection.Close();}}/// <summary>/// 执行插入操作/// </summary>/// <param name="tableName">表名</param>/// <param name="key_values">键值对字典</param>/// <returns>int</returns>public int Insert(string tableName, List<SQLiteParameter> parameters){using (var cmd = _connection.CreateCommand()){// 添加参数到命令对象  cmd.Parameters.AddRange(parameters.ToArray());// 构建INSERT语句的列名部分和值部分  string columnNames = string.Join(",", parameters.Select(p => p.ParameterName));string placeholders = string.Join(",", parameters.Select(p => "@"+p.ParameterName));// 构建完整的INSERT语句  string query = $"INSERT INTO {tableName} ({columnNames}) VALUES ({placeholders});";cmd.CommandText = query;// 执行命令并返回受影响的行数  return cmd.ExecuteNonQuery();}}/// <summary>/// 执行插入操作/// </summary>/// <param name="tableName">表名</param>/// <param name="key_values">键值对字典</param>/// <returns>int</returns>public int Insert(string tableName, Dictionary<string, object> key_values){using (var cmd = _connection.CreateCommand()){List<string> columns = new List<string>();List<SQLiteParameter> parameters = new List<SQLiteParameter>();int index = 0;foreach (var kvp in key_values){columns.Add(kvp.Key);parameters.Add(new SQLiteParameter($"@{kvp.Key}", kvp.Value));cmd.Parameters.Add(parameters[index]);index++;}string query = $"INSERT INTO {tableName} ({string.Join(",", columns)}) VALUES ({string.Join(",", parameters.Select(p => "@" + p.ParameterName))});";cmd.CommandText = query;return cmd.ExecuteNonQuery();}}/// <summary>/// 执行更新操作/// </summary>/// <param name="tableName">表名</param>/// <param name="setValues">新数据</param>/// <param name="whereClause">条件</param>/// <param name="parameters">条件数据</param>/// <returns>int</returns>public int Update(string tableName, Dictionary<string, object> setValues, string whereClause, List<SQLiteParameter> parameters){using (var cmd = _connection.CreateCommand()){List<string> setColumns = new List<string>();int index = 0;foreach (var kvp in setValues){setColumns.Add($"{kvp.Key} = @{kvp.Key}");cmd.Parameters.Add(new SQLiteParameter($"@{kvp.Key}", kvp.Value));index++;}string query = $"UPDATE {tableName} SET {string.Join(",", setColumns)} WHERE {whereClause}";cmd.CommandText = query;cmd.Parameters.AddRange(parameters.ToArray());return cmd.ExecuteNonQuery();}}/// <summary>/// 执行删除操作/// </summary>/// <param name="tableName">表名</param>/// <param name="whereClause">条件</param>/// <param name="parameters">参数数据</param>/// <returns>int</returns>public int Delete(string tableName, string whereClause, List<SQLiteParameter> parameters){using (var cmd = _connection.CreateCommand()){cmd.CommandText = $"DELETE FROM {tableName} WHERE {whereClause};";cmd.Parameters.AddRange(parameters.ToArray());return cmd.ExecuteNonQuery();}}/// <summary>/// 执行查询操作/// </summary>/// <param name="sql">sql语句</param>/// <param name="parameters">参数数据</param>/// <returns>DataTable</returns>public DataTable Select(string sql, List<SQLiteParameter> parameters){DataTable dt = new DataTable();using (var cmd = _connection.CreateCommand()){cmd.CommandText = sql;cmd.Parameters.AddRange(parameters.ToArray());using (var reader = cmd.ExecuteReader()){dt.Load(reader);}}return dt;}/// <summary>/// 执行自定义SQL语句,返回影响行数/// </summary>/// <param name="sql"></param>/// <returns>int类型</returns>public int ExecuteSQL(string sql){using (var cmd = _connection.CreateCommand()){cmd.CommandText = sql;return cmd.ExecuteNonQuery();}}/// <summary>/// 执行自定义SQL语句,返回影响行数/// </summary>/// <param name="sql"></param>/// <param name="parameters"></param>/// <returns>int类型</returns>public int ExecuteSQL(string sql, List<SQLiteParameter> parameters){using (var cmd = _connection.CreateCommand()){cmd.CommandText = sql;cmd.Parameters.AddRange(parameters.ToArray());return cmd.ExecuteNonQuery();}}/// <summary>/// 执行自定义sql查询语句,如果你计划对返回的 DataTable 进行大量的后续操作(例如,添加或删除行,修改列值等),那么使用 SQLiteDataAdapter 可能会更有优势,因为它提供了更高级的数据绑定和更新功能/// </summary>/// <param name="sql"></param>/// <param name="parameters"></param>/// <returns>DataTable</returns>public DataTable ExecuteSelect(string sql, List<SQLiteParameter> parameters){using (SQLiteCommand command = _connection.CreateCommand()){command.CommandText = sql;command.Parameters.AddRange(parameters.ToArray());using (SQLiteDataAdapter adapter = new SQLiteDataAdapter(command)){DataTable dataTable = new DataTable();adapter.Fill(dataTable); // 填充数据表  return dataTable; // 返回查询结果的数据表  }}}/// <summary>/// 批量操作/// </summary>/// <param name="sql"></param>/// <param name="parameters"></param>/// <returns></returns>public int BatchExecuteSQL(string sql, List<List<SQLiteParameter>> parameters){int affectedRows = 0;using (var transaction = _connection.BeginTransaction()){try{using (var cmd = _connection.CreateCommand()){cmd.Transaction = transaction;foreach (var paramList in parameters){cmd.CommandText = sql;cmd.Parameters.Clear();cmd.Parameters.AddRange(paramList.ToArray());affectedRows += cmd.ExecuteNonQuery();}transaction.Commit(); // 提交事务  }}catch (Exception ex){transaction.Rollback(); // 发生异常时回滚事务  throw; // 重新抛出异常,以便上层调用者处理  }}return affectedRows;}}
}

3.SQLiteHelper使用示例:
public void test(){string databasePath = "path_to_your_database.db"; // 替换为你的数据库文件路径  SQLiteHelper helper = new SQLiteHelper(databasePath);try{// 打开数据库连接  helper.OpenConnection();// 插入数据示例  Dictionary<string, object> valuesToInsert = new Dictionary<string, object>{{ "Name", "John Doe" },{ "Age", 30 },{ "Email", "johndoe@example.com" }};int insert_count = helper.Insert("Users", valuesToInsert);// 插入数据示例  List<SQLiteParameter> insert_parameters = new List<SQLiteParameter>(){new SQLiteParameter( "Name", "John Doe" ),new SQLiteParameter("Age", 30 ),new SQLiteParameter("Email", "johndoe@example.com")};int insert_count2 = helper.Insert("Users", insert_parameters);// 更新数据示例  Dictionary<string, object> valuesToUpdate = new Dictionary<string, object>{{ "Age", 31 }};int update_count = helper.Update("Users", valuesToUpdate, "Name = @Name", new List<SQLiteParameter>(){ new SQLiteParameter("@Name", "John Doe") });// 删除数据示例  int delete_count = helper.Delete("Users", "Name = @Name", new List<SQLiteParameter>() { new SQLiteParameter("@Name", "John Doe") });// 查询数据示例  DataTable dataTable = helper.Select("SELECT * FROM Users WHERE Name = @Name", new List<SQLiteParameter>() { new SQLiteParameter("@Name", "John Doe") });foreach (DataRow row in dataTable.Rows){Console.WriteLine($"Name: {row["Name"]}, Age: {row["Age"]}, Email: {row["Email"]}");}//批量操作示例string sql = "INSERT INTO Users (Name,Age,Email) VALUES (@Name,@Age,@Email);";List<List<SQLiteParameter>> parameterList = new List<List<SQLiteParameter>>();for (int i = 0; i < 10; i++){List<SQLiteParameter> parameters = new List<SQLiteParameter>();parameters.Add(new SQLiteParameter("@Name", $"名字{i}"));parameters.Add(new SQLiteParameter("@Age", i));parameters.Add(new SQLiteParameter("@Email", $"邮箱{i}"));parameterList.Add(parameters);}int batch_count = helper.BatchExecuteSQL(sql, parameterList);}catch (Exception ex){Console.WriteLine("An error occurred: " + ex.Message);}finally{// 关闭数据库连接  helper.CloseConnection();}}

注意:在构建sql语句时,占位符尽量不要用"?",虽然大多数据库用"?"是标准做法,但是本人用System.Data.SQLite实际操作过程中,很多情况会报数据类型不匹配异常,最好还是用"@前缀"好一点

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

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

相关文章

天眼护航 安全无界:天通哨兵PS02—电力巡检保护的智能利器

在电力行业中&#xff0c;输电线路的安全稳定运行对于保障社会经济活动至关重要。然而&#xff0c;广阔的输电线路常常穿越复杂的地形和恶劣的自然环境&#xff0c;给电力巡检和保护工作带来了巨大挑战。 为了提高巡检效率和响应速度&#xff0c;更好地保障电力设施的安全运行…

前端三剑客 —— CSS (第三节)

目录 上节回顾&#xff1a; 1.CSS使用有以下几种样式; 2.选择器 1.基本选择器 2.包含选择器 3.属性选择器 [] 4.伪类选择器 &#xff1a; 5.伪元素选择器 ::before :after 3.常见样式的使用 常见样式参考表 一些特殊样式 媒体查询 自定义字体 变换效果 translate&…

深入PostgreSQL中的pg_global表空间

pg_global表空间的位置 在PG当中&#xff0c;一个实例(cluster)初始化完以后&#xff0c;你会看到有下边两个与表空间相关的目录生成&#xff1a; $PGDATA/base $PGDATA/global 我们再用元命令\db以及相关视图看看相应的表空间信息&#xff1a; postgres# \db …

雨云服务器:当清风遇上明月,服务器的美好新时代

引言&#xff1a;为什么说服务器是网站的“心脏”&#xff1f; 在数字时代&#xff0c;网站已经成为企业和个人展示自己的重要平台。然而&#xff0c;想要网站运行得稳定、快速&#xff0c;除了好的内容外&#xff0c;一个稳定、高效的服务器也是至关重要的。就像人体需要有一…

【解决】Unity Profile | FindMainCamera

开发平台&#xff1a;Unity 2020.3.7f1c1 关键词&#xff1a;FindMainCamera   问题背景 ModelViewer 是开发者基于 UnityEngine 编写的相机控制组件。ModelView.Update 中调度52次并触发3次GC.Collect。显然并不期望并尽可能避免 Update 造成的GC 问题。事实上 FindMainCame…

Qt | Qt 的重要文件简介(推荐)

一、项目文件(pro 文件)及其语法 1、项目文件(pro 文件)的作用是列举项目中的源文件, 2、pro 文件的语法形式为:“变量 操作符 值”,比如 QT += widgets,多个值之间使用空格分开。 3、pro 文件的注释:从“#”开始,直至本行结束。 4、pro 文件的操作符见下表 5、pro 文…

Ansible批量操作(上传文件、删除文件指定文件内容、执行sh文件等)

官方网站 https://www.ansible.com/ 一、Ansible 简介 1、Ansible是新出现的自动化运维工具&#xff0c;完全基于Python开发&#xff0c;集合了众多运维工具&#xff08;puppet、chef、func、fabric&#xff09;的优点&#xff0c;实现了批量系统配置、批量程序部署、批量运行…

随机生成Long全范围数

随机生成Long全范围数 前言实现思路主要代码分区随机生成过程案例&#xff1a;随机生成100个数 朴素的比较总结 前言 使用自带的Random.nextLong()函数生成Long型的长整数&#xff0c;范围比较小&#xff0c;如下图。100个随机数没看见10以内的数字。所以考虑实现随机化生成大…

计算机网络:局域网的数据链路层

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

Android 高德地图

1.获取Key 进入高德开放平台控制台&#xff0c;创建一个新应用。在创建的应用上点击"添加key"按钮&#xff0c;在弹出的对话框中&#xff0c;依次输入key名称&#xff0c;选择服务平台为“Android平台”&#xff0c;输入发布版安全码 SHA1、以及 Package。 获取 S…

Windows系统基于WSL子系统的torchquantum安装记录GPU版本

子系统需要的环境&#xff1a; anaconda/miniconda、pip换源(清华源) 1.准备 torchquantum最新版本可以从github上找到&#xff0c;直接clone/下载整个project&#xff0c;查看环境要求&#xff0c;需要安装pytorch和tensorflow 新建一个conda环境&#xff0c;注意python最…

Docker,anaconda环境的部署与迁移

功能上线将提上日程&#xff0c;但是如何将我windows环境下的程序放到linux服务器的测试环境跑通呢&#xff1f;这是我这整个清明假期将要解决的一件事&#xff0c;最蠢的办法就是看自己的环境下有哪些依赖&#xff0c;如何到服务器上一个一个下&#xff0c;但是首先这个方法很…

操作系统导论课后作业-第十七章答案

课程作业-第十七章&#xff1a; 17.1首先以标志flag -n 10 -H 0 -p BEST -s 0运行程序来产生一些随机的分配和空闲。你能预测malloc()/free()会返回什么吗&#xff1f;你可以在每次请求后猜测空闲列表的状态吗&#xff1f;随着时间的推移&#xff0c;你对空闲列表有什么发现&a…

c++20协程详解(三)

前言 前面两节我们已经能够实现一个可用的协程框架了。但我们一定还想更深入的了解协程&#xff0c;于是我们就想尝试下能不能co_await一个协程。下面会涉及到部分模板编程的知识&#xff0c;主要包括&#xff08;模板偏特化&#xff0c;模板参数列表传值&#xff0c;模板函数…

谷歌(Google)技术面试——在线评估问题(三)

谷歌&#xff08;Google&#xff09;面试过程的第一步&#xff0c;你可能会收到一个在线评估链接。 评估有效期为 7 天&#xff0c;包含两个编码问题&#xff0c;需要在一小时内完成。 以下是一些供你练习的在线评估问题。 在本章结尾处&#xff0c;还提供了有关 Google 面试不…

进销存管理系统:食品批发零售迈向数字化未来-亿发

随着消费逐步复苏&#xff0c;食品批发零售行业也迎来了客流的回升&#xff0c;实体店重新焕发了生机。然而&#xff0c;随着数字化时代的来临&#xff0c;传统的食品批发零售企业面临着新的挑战和机遇。些企业正积极实施数字化转型&#xff0c;通过布局线上线下多业态的融合发…

分布式事务之Seata使用

分布式事务解决方案之Seata Seata的概念 Seata是阿里巴巴开源的分布式事务解决方案&#xff0c;致力于提供高性能和简单易用的分布式事务服务。Seata 提供了 AT、TCC、SAGA 和 XA 事务模式&#xff0c;为用户打造一站式的分布式解决方案。 Seata官网给出的架构示例如下&#…

ruoyi-nbcio-plus基于vue3的flowable流程设计器主界面升级修改

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://122.227.135.243:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a…

mysql故障排查

MySQL是目前企业最常见的数据库之一日常维护管理的过程中&#xff0c;会遇到很多故障汇总了常见的故障&#xff0c;MySQL默认配置无法满足高性能要求 一 MySQL逻辑架构图 客户端和连接服务核心服务功能存储擎层数据存储层 二 MySQL单实例常见故障 故障1 ERROR 2002 (HY000)…

深入理解npm常用命令

npm&#xff08;Node Package Manager&#xff09;是 Node.js 的包管理工具&#xff0c;用于管理 Node.js 应用程序的依赖包。除了安装、更新和卸载依赖包外&#xff0c;npm 还提供了许多其他功能&#xff0c;如初始化项目、运行脚本、查看依赖树等。本文将详细介绍一些常用的 …