关于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实际操作过程中,很多情况会报数据类型不匹配异常,最好还是用"@前缀"好一点

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

EDM邮件推广营销工具多少钱?

云衔科技&#xff0c;凭借专业的技术研发实力与丰富的行业经验&#xff0c;倾力打造了一款智能EDM&#xff08;Electronic Direct Mail&#xff09;邮件营销系统解决方案&#xff0c;以精准、高效、定制化的服务&#xff0c;为企业开启全新的营销之旅。至于价格&#xff0c;云衔…

计算机笔记(3)续20个

41.WWW浏览器和Web服务器都遵循http协议 42.NTSC制式30帧/s 44.三种制式电视&#xff1a;NTSC&#xff0c;PAL&#xff0c;SECAM 45.IP&#xff0c;子网掩码白话文简述&#xff1a; A类地址&#xff1a;取值范围0-127&#xff08;四段数字&#xff08;127.0.0.0&#xff09…

Hadoop和zookeeper集群相关执行脚本(未完,持续更新中~)

1、Hadoop集群查看状态 搭建Hadoop数据集群时&#xff0c;按以下路径操作即可生成脚本 [test_1analysis01 bin]$ pwd /home/test_1/hadoop/bin [test_01analysis01 bin]$ vim jpsall #!/bin/bash for host in analysis01 analysis02 analysis03 do echo $host s…

docker安装jenkins 2024版

docker 指令安装安装 docker run -d --restartalways \ --name jenkins -uroot -p 10340:8080 \ -p 10341:50000 \ -v /home/docker/jenkins:/var/jenkins_home \ -v /var/run/docker.sock:/var/run/docker.sock \ -v /usr/bin/docker:/usr/bin/docker jenkins/jenkins:lts访问…

利用Python将TXT文件中的经纬度数据转换为JSON格式

在处理地理空间数据时&#xff0c;经常需要将数据从一种格式转换为另一种格式&#xff0c;以便于后续的分析或可视化。本文将介绍如何使用Python脚本将存储在TXT文件中的经纬度数据转换为JSON格式。 一、背景介绍 经纬度数据是地理信息系统&#xff08;GIS&#xff09;中的基…

关于ansible的模块 ③

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 接《关于Ansible的模块①》和《关于Ansible的模块②》&#xff0c;继续学习ansible的user模块。 user模块可以增、删、改linux远…

BugKu:Simple SSTI

1.进入此题 2.查看源代码 可以知道要传入一个名为flag的参数&#xff0c;又说我们经常设置一个secret_key 3.flask模版注入 /?flag{{config.SECRET_KEY}} 4.学有所思 4.1 什么是flask&#xff1f; flask是用python编写的一个轻量web开发框架 4.2 SSTI成因&#xff08;SST…

[图解]DDD领域驱动设计伪创新-通用语言05

0 00:00:01,060 --> 00:00:04,370 甚至有的人把这个当成恩典 1 00:00:08,730 --> 00:00:11,500 他认为这个对技术人员有好处 2 00:00:13,010 --> 00:00:14,790 他掌握了主动权 3 00:00:15,730 --> 00:00:16,501 这样的话 4 00:00:16,501 --> 00:00:18,430 你…

CANoe自带的TCP/IP协议栈中TCP的keep alive机制是如何工作的

TCP keep alive机制我们已经讲过太多次,车内很多控制器的TCP keep alive机制相信很多开发和测试的人也配置或者测试过。我们今天想知道CANoe软件自带的TCP/IP协议栈中TCP keep alive机制是如何工作的。 首先大家需要知道TCP keep alive的参数有哪些?其实就三个参数:CP_KEEP…

JVM之常用监控工具

JVM之常用监控工具 jps jinfo 获取配置信息 基本语法 jinfo [options] <pid>常用选项 -sysprops&#xff1a;显示JVM进程的系统属性。-flags&#xff1a;显示用于启动JVM的命令行标志和VM选项。-flag <name>&#xff1a;显示指定JVM标志的当前值。-flag [|-]&…

【JSON2WEB】 12基于Amis-admin的动态导航菜单树

【JSON2WEB】01 WEB管理信息系统架构设计 【JSON2WEB】02 JSON2WEB初步UI设计 【JSON2WEB】03 go的模板包html/template的使用 【JSON2WEB】04 amis低代码前端框架介绍 【JSON2WEB】05 前端开发三件套 HTML CSS JavaScript 速成 【JSON2WEB】06 JSON2WEB前端框架搭建 【J…

Firefox 关键词高亮插件的简单实现

目录 1、配置 manifest.json 文件 2、编写侧边栏结构 3、查找关键词并高亮的方法 3-1&#xff09; 如果直接使用 innerHTML 进行替换 4、清除关键词高亮 5、页面脚本代码 6、参考 1、配置 manifest.json 文件 {"manifest_version": 2,"name": &quo…

配置zookeeper的时候三个节点都启动了但是查询zookeeper的角色的时候显示没启动成功

场景 搭建了一个音乐平台数仓&#xff0c;一共有五个节点&#xff0c;其中三个节点配置zookeeper&#xff0c;我的操作是先把这三个节点的zookeeper全部启动&#xff0c;然后再分别查询各自zookeeper的角色。出现了一下问题&#xff1a; Error contacting service. It is proba…

网络层

网络层主要负责两方面的事情 1.地址管理&#xff1a;制定一系列的规则&#xff0c;通过地址&#xff0c;描述出网络中的设备的位置 2.路由选择&#xff1a;网络环境是非常复杂的。从一个节点到另外一个节点之间&#xff0c;存在很多条不同的路径&#xff0c;通过路由选择来筛…

【nc工具信息传输】

nc&#xff0c;全名叫 netcat&#xff0c;它可以用来完成很多的网络功能&#xff0c;譬如端口扫描、建立TCP/UDP连接&#xff0c;数据传输、网络调试等等&#xff0c;因此&#xff0c;它也常被称为网络工具的 瑞士军刀 。 nc [-46DdhklnrStUuvzC] [-i interval] [-p source_po…

3.恒定乘积自动做市商算法及代码

中心化交易所的安全风险 在中心化交易所中注册账户时&#xff0c;是由交易所生成一个地址&#xff0c;用户可以向地址充币&#xff0c;充到地址之后交易所就会根据用户充币的数量显示在管理界面中。但是充币的地址是掌管在交易所之中的&#xff0c;资产的控制权还是在交易所。…

【Java多线程(4)】案例:设计模式

目录 一、什么是设计模式&#xff1f; 二、单例模式 1. 饿汉模式 2. 懒汉模式 懒汉模式-第一次改进 懒汉模式-第二次改进 懒汉模式-第三次改进 一、什么是设计模式&#xff1f; 设计模式是针对软件设计中常见问题的通用解决方案。它们提供了一种被广泛接受的方法来解决…

【2024系统架构设计】案例分析- 5 Web应用

目录 一 基础知识 二 真题 一 基础知识 1 Web应用技术分类 大型网站系统架构的演化:高性能、高可用、可维护、应变、安全。 从架构来看:MVC,MVP,MVVM,REST,Webservice,微服务。

从头开发一个RISC-V的操作系统(一)计算机系统漫游

文章目录 前提计算机的硬件组成程序的存储与执行操作系统 目标&#xff1a;通过这一个系列课程的学习&#xff0c;开发出一个简易的在RISC-V指令集架构上运行的操作系统。 前提 这个系列的大部分文章和知识来自于&#xff1a;[完结] 循序渐进&#xff0c;学习开发一个RISC-V上…

element-ui divider 组件源码分享

今日简单分享 divider 组件&#xff0c;主要有以下两个方面&#xff1a; 1、divider 组件页面结构 2、divider 组件属性 一、组件页面结构 二、组件属性 2.1 direction 属性&#xff0c;设置分割线方向&#xff0c;类型 string&#xff0c;horizontal / vertical&#xff0…