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

news2024/11/23 10:54:11

主要功能:增删改查、自定义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;

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, 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);

                // 更新数据示例  
                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();
            }
        }

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

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

相关文章

Linux提权!!!

上一篇文章讲了Windows的提权&#xff0c;那么这篇文章就来讲一下Linux的提权 1.SUID提权 suid权限 作用&#xff1a;让普通用户临时拥有该文件的属主的执行权限&#xff0c;suid权限只能应用在二进制可执行文件&#xff08;命令&#xff09;上&#xff0c;而且suid权限只能设置…

【前端面试3+1】09 ES6新特性、Promise原理 、浏览器从输入到页面渲染的过程、【罗马数字转整数】

一、ES6新特性 ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript的一个重要更新版本&#xff0c;引入了许多新特性和语法改进&#xff0c;下面详细说明一些主要的新特性&#xff1a; 1. let 和 const 声明&#xff1a; 使用let和const关键字可以声明块级作用域的变量&a…

Go-Gin中优雅的实现参数校验,自定义错误消息提示

问题描述 在参数校验的时候我们一般会基于"github.com/go-playground/validator/v10"这个库给结构体加标签实现校验参数&#xff0c;当参数校验错误的时候&#xff0c;他的提示一般是英文的&#xff0c;怎么自定义参数错误提示呢&#xff1f;跟着我一步步来 注册校…

集合的学习

为什么要有集合&#xff1a;集合会自动扩容 集合不能存基本数据类型&#xff08;基本数据类型是存放真实的值&#xff0c;而引用数据类型是存放一个地址&#xff0c;这个地址存放在栈区&#xff0c;地址所指向的内容存放在堆区&#xff09; 数组和集合的对比&#xff1a; 集…

什么是js、ajax

1.什么是js JavaScript&#xff08;简称 JS&#xff09;是一种轻量级、解释型的编程语言&#xff0c;通常用于在 Web 页面上添加交互性、动态性和动画效果。它是世界上最流行的编程语言之一&#xff0c;也是唯一一种可以在 Web 浏览器中运行的编程语言。 2.什么是AJAX ajax…

华为审核被拒提示: 您的应用存在(最近任务列表隐藏风险活动)的行为,不符合华为应用市场审核标准

应用审核意见&#xff1a; 您的应用存在&#xff08;最近任务列表隐藏风险活动&#xff09;的行为&#xff0c;不符合华为应用市场审核标准。 修改建议&#xff1a;请参考测试结果进行修改。 请参考《审核指南》第2.19相关审核要求&#xff1a;https://developer.huawei.com/c…

算法整理:二分查找

1二分查找&#xff1a;在有序集合搜索特定值的过程&#xff0c;每次比较之后将查找空间一分为二。 target:要查找的值 index:当前位置 left,right:维持查找空间的指标 mid:用来确定向左查还是向右查的索引 查找空间: [left,right] 二分查找维护left&#xff0c;right&#xff0…

ElementUI 表格横向滚动条时滚动到指定位置

ElementUI 表格横向滚动条时滚动到指定位置 getColumnOffset(columnProp) {this.$nextTick(() > {const table this.$refs.tableRef.$refs.multipleTable;const columns table.columns;const column columns.find((col) > col.property columnProp);if (column) {// …

Transformer模型-softmax的简明介绍

今天介绍transformer模型的softmax softmax的定义和目的&#xff1a; softmax&#xff1a;常用于神经网络的输出层&#xff0c;以将原始的输出值转化为概率分布&#xff0c;从而使得每个类别的概率值在0到1之间&#xff0c;并且所有类别的概率之和为1。这使得Softmax函数特别适…

rabbitmq死信交换机,死信队列使用

背景 对于核心业务需要保证消息必须正常消费&#xff0c;就必须考虑消费失败的场景&#xff0c;rabbitmq提供了以下三种消费失败处理机制 直接reject&#xff0c;丢弃消息&#xff08;默认&#xff09;返回nack&#xff0c;消息重新入队列将失败消息投递到指定的交换机 对于核…

SpringBoot | Spring Boot“整合Redis“

目录: 1. Redis 介绍2. Redis 下载安装3. Redis “服务开启”和“连接配置”4. Spring Boot整合Redis的“前期准备” :① 编写实体类② 编写Repository 接口③ 在“全局配置文件”中添加 “Redis数据库” 的 “相关配置信息” 5. Spring Boot整合“Redis” (案例展示) 作者简介…

【蓝桥杯嵌入式】13届程序题刷题记录及反思

一、题目分析 考察内容&#xff1a; led按键&#xff08;短按&#xff09;PWM输出&#xff08;PA1&#xff09;串口接收lcd显示 根据PWM输出占空比调节&#xff0c;高频与低频切换 串口接收&#xff08;指令解析&#xff09;【中断接收】 2个显示界面 led灯闪烁定时器 二…

Centos8/linux/虚拟机安装docker

docker分为ce版和ee版&#xff0c;像一般的小型团体和个人使用ce版就够了&#xff0c;别问为什么&#xff0c;问就是ee版收费。 1.首先切换到root用户 2.为确保安装时出现不必要的问题&#xff0c;先更新一下yum包 sudo yum update 3.如果之前安装过需要删除之间安装的CE版…

Flutter应用混淆技术原理与实践

在移动应用开发中&#xff0c;保护应用代码安全至关重要。Flutter 提供了简单易用的混淆工具&#xff0c;帮助开发者在构建 release 版本应用时有效保护代码。本文将介绍如何在 Flutter 应用中使用混淆&#xff0c;并提供了相关的操作步骤和注意事项。 &#x1f4dd; 摘要 本…

基于深度学习的车牌检测系统(网页版+YOLOv8/v7/v6/v5代码+训练数据集)

摘要&#xff1a;本文深入研究了基于YOLOv8/v7/v6/v5的车牌检测系统&#xff0c;核心采用YOLOv8并整合了YOLOv7、YOLOv6、YOLOv5算法&#xff0c;进行性能指标对比&#xff1b;详述了国内外研究现状、数据集处理、算法原理、模型构建与训练代码&#xff0c;及基于Streamlit的交…

StreamingT2V文本生成视频多模态大模型,即将开源!

1、前言 Picsart人工智能研究所、德克萨斯大学和SHI实验室的研究人员联合推出了StreamingT2V视频模型。通过文本就能直接生成2分钟、1分钟等不同时间&#xff0c;动作一致、连贯、没有卡顿的高质量视频。 虽然StreamingT2V在视频质量、多元化等还无法与Sora媲美&#xff0c;但…

【zlm】音视频流与音频流合并的设计

目录 设想一 设想二 方案三 关键技术 测试语句 测试脚本 参考文档 设想一 //开始录制_option.mp4_save_path custom_path;_option.mp4_max_second max_second;vector<Track::Ptr> mytracks getTracks();auto src MediaSource::find( DEFAULT_VHOST, "1&quo…

基于单片机32X32LED汉字滚动点阵屏显示设计

**单片机设计介绍&#xff0c;基于单片机32X32LED汉字滚动点阵屏显示设计 文章目录 一 概要二、功能设计三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机32X32LED汉字滚动点阵屏显示设计是一个融合了硬件、软件以及电子显示技术的综合性项目。以下是对该设计的…

ES8 学习 -- async 和 await / 对象方法扩展 / 字符串填充

文章目录 1. async 和 await1.1 基本语法1.2 使用示例1.3 案例练习 2. 对象方法扩展2.1 Object.values(obj)2.2 Object.entries(obj)2.3 Object.getOwnPropertyDescriptors(obj)使用示例 3. 字符串填充4. 函数参数的末尾加逗号 1. async 和 await async 函数&#xff0c;使得异…

【嵌入式硬件】光耦

1.光耦作用 光耦一般用于信号的隔离。当两个电路的电源参考点不相关时,使用光耦可以保证在两边不共地的情况下,完成信号的传输。 2.光耦原理 光耦的原理图如下所示,其内部可以看做一个特殊的“三极管”; 一般的三极管是通过基极B和发射极E间的电流,去控制集电极C和发射极…