WinForm中封装SqlSugar工具类实现SQLite数据库操作

在WinForm里用SQLite的时候,我习惯拿SqlSugar再包一层工具类,这样业务代码里不用每次都拼连接串、配参数,增删改查和分页也能统一调。这篇文章记一下这个封装的完整写法,包含带条件的分页查询。

把SqlSugar加到项目里没什么说的,NuGet里搜一下安装就行。

Install-Package SqlSugar

建一个类,比如叫SqlSugarHelper,构造函数里把连接串和配置传进去。这里数据库类型指定成DbType.SqliteIsAutoCloseConnection设成true就不用自己管理连接开关,InitKeyTypeAttribute让主键什么的走特性标注。

Aop那行我用来记SQL日志。OnLogExecuting会在每次执行SQL前触发,把SQL和参数打出来,调试的时候特别管用。

生产环境别往控制台打了,输出到文件或者接日志组件更合适。

using SqlSugar;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;

public class SqlSugarHelper
{
    private SqlSugarClient _db;

    public SqlSugarHelper(string connectionString)
    {
        _db = new SqlSugarClient(new ConnectionConfig()
        {
            ConnectionString = connectionString,
            DbType = DbType.Sqlite,
            IsAutoCloseConnection = true,
            InitKeyType = InitKeyType.Attribute
        });

        // 配置Aop事件,用于记录SQL日志
        _db.Aop.OnLogExecuting = (sql, pars) =>
        {
            Console.WriteLine(sql);
            foreach (var par in pars)
            {
                Console.WriteLine($"{par.ParameterName}:{par.Value}");
            }
            Console.WriteLine();
        };
    }

    // 查询所有记录
    public List<T> GetAll<T>() where T : class, new()
    {
        return _db.Queryable<T>().ToList();
    }

    // 根据主键查询记录
    public T GetById<T>(object id) where T : class, new()
    {
        return _db.Queryable<T>().InSingle(id);
    }

    // 插入记录
    public int Insert<T>(T entity) where T : class, new()
    {
        return _db.Insertable(entity).ExecuteCommand();
    }

    // 批量插入记录
    public int InsertRange<T>(List<T> entities) where T : class, new()
    {
        return _db.Insertable(entities).ExecuteCommand();
    }

    // 更新记录
    public bool Update<T>(T entity) where T : class, new()
    {
        return _db.Updateable(entity).ExecuteCommand() > 0;
    }

    // 删除记录
    public bool Delete<T>(object id) where T : class, new()
    {
        return _db.Deleteable<T>().In(id).ExecuteCommand() > 0;
    }

    // 分页查询,包含条件查询
    public PageResult<T> GetPaged<T>(int pageIndex, int pageSize, Func<ISugarQueryable<T>, ISugarQueryable<T>> queryFunc = null) where T : class, new()
    {
        var total = 0;
        var queryable = _db.Queryable<T>();
        if (queryFunc != null)
        {
            queryable = queryFunc(queryable);
        }
        var list = queryable.ToPageList(pageIndex, pageSize, ref total);
        return new PageResult<T>
        {
            Items = list,
            TotalCount = total,
            PageIndex = pageIndex,
            PageSize = pageSize
        };
    }

    // 执行原生SQL查询
    public DataTable ExecuteQuery(string sql, params SqlSugarParameter[] parameters)
    {
        return _db.Ado.SqlQuery(sql, parameters);
    }

    // 执行原生SQL命令
    public int ExecuteCommand(string sql, params SqlSugarParameter[] parameters)
    {
        return _db.Ado.ExecuteCommand(sql, parameters);
    }
}

// 分页结果类
public class PageResult<T>
{
    public List<T> Items { get; set; }
    public int TotalCount { get; set; }
    public int PageIndex { get; set; }
    public int PageSize { get; set; }
}

这些方法足够应付多数场景了。

GetAll拉全部,GetById拿单条,InsertInsertRange一个插单个一个插一批,UpdateDelete返回bool告诉你成没成功。ExecuteQueryExecuteCommand留给想自己写SQL的情况,返回DataTable或者影响行数。

分页那块稍微复杂点。GetPaged传页码、页大小,还有一个可选的Func委托,让你在分页之前加Where条件。返回的PageResult里带着总条数、当前页这些信息,绑列表控件直接拿Items就行。

lcjmSSL为用户提供自动部署功能,证书申请成功后,能够自动部署到用户的服务器和应用中。用户也可以通过API接口或回调接口,定制自己的部署方案。无论是小规模项目还是复杂的系统架构,都能实现证书的高效部署。

如果不需要条件查询,第三个参数直接不传,就返回整表的分页。

下面是个带条件的分页调用例子,连日期和结果字段一起过滤。

public partial class MainForm : Form
{
    private SqlSugarHelper _dbHelper;

    public MainForm()
    {
        InitializeComponent();
        string connectionString = "Data Source=your_database_file.db;Version=3;";
        _dbHelper = new SqlSugarHelper(connectionString);
    }

    private void btnGetPagedWithConditions_Click(object sender, EventArgs e)
    {
        int pageIndex = 1;
        int pageSize = 10;
        DateTime startDate = DateTime.Parse("2023-01-01");
        DateTime endDate = DateTime.Parse("2023-12-31");
        string result = "success";

        var pagedResult = _dbHelper.GetPaged<YourEntity>(pageIndex, pageSize, queryable =>
        {
            return queryable
                .Where(x => x.Date >= startDate && x.Date <= endDate)
                .Where(x => x.Result == result);
        });

        // 处理分页查询结果
    }
}

SqlSugar的Aop在调试阶段能省不少事,上面构造函数里那几行会把每次执行的SQL和参数输出来,一眼就能看到拼的对不对。正式环境记得换个落地方式,别直接Console,写日志文件或者集成到你现有的日志体系里都行。

工具类里没加异常处理,实际用的时候看情况在外面try catch或者加个全局Aop拦截,这些都可以按自己项目习惯来。

SQLite并发不大时这样封一层已经够用,后面如果切到其他库比如MySql,改个DbType和连接串就行,不用动太多代码。

posted @ 2026-07-21 19:56  枫唐  阅读(2)  评论(0)    收藏  举报