【C#桌面客户端系列学习-12】封装SQLite数据库基础操作工具类(CURD)

目录

一、安装SQLite驱动

二、数据库工具类封装

1、创建SqliteHelper类

2、填写数据库配置信息

3、验证创建成功

三、CURD操作示例


为方便对SQLite数据库操作,封装成工具类,可在任意地方调用。

一、安装SQLite驱动

在VS2022中,右键项目->管理NuGet程序包,搜索并安装"System.Data.SQLite.Core",安装好就可以直接使用了。

二、数据库工具类封装

SqliteHelper工具类是一个静态工具类,创建一个普通的C#类文件就行。

创建步骤: 在解决方案资源管理器 中,右键你的项目 → 添加 → 类。命名SqliteHelper.cs

这里没有写命名空间,是为了能够在任何窗体里都可以直接使用SqliteHelper类,不用额外再using。

1、创建SqliteHelper类

cs 复制代码
using System;
using System.Configuration;
using System.Data;
using System.Data.SQLite;
using System.Windows.Forms;

/// <summary>
/// SQLite 数据库工具类,结构与 MySqlHelper 保持一致
/// </summary>
public static class SqliteHelper
{

    // 数据库连接信息
    private static readonly string connectionString =
        "Data Source=" + System.IO.Path.Combine(Application.StartupPath, "c_test.db") + ";Version=3;";

    /// <summary>
    /// 获取一个新的数据库连接(调用方负责释放)
    /// </summary>
    public static SQLiteConnection GetConnection()
    {
        return new SQLiteConnection(connectionString);
    }

    /// <summary>
    /// 执行增删改,返回受影响的行数
    /// </summary>
    public static int ExecuteNonQuery(string sql, params SQLiteParameter[] parameters)
    {
        using (var connection = GetConnection())
        {
            connection.Open();
            using (var command = new SQLiteCommand(sql, connection))
            {
                if (parameters != null)
                    command.Parameters.AddRange(parameters);

                return command.ExecuteNonQuery();
            }
        }
    }

    /// <summary>
    /// 执行查询,返回 DataTable
    /// </summary>
    public static DataTable ExecuteDataTable(string sql, params SQLiteParameter[] parameters)
    {
        using (var connection = GetConnection())
        {
            connection.Open();
            using (var command = new SQLiteCommand(sql, connection))
            {
                if (parameters != null)
                    command.Parameters.AddRange(parameters);

                var adapter = new SQLiteDataAdapter(command);
                var dataTable = new DataTable();
                adapter.Fill(dataTable);
                return dataTable;
            }
        }
    }

    /// <summary>
    /// 执行查询,返回第一行数据(DataRow)。无数据时返回 null
    /// </summary>
    public static DataRow ExecuteDataRow(string sql, params SQLiteParameter[] parameters)
    {
        DataTable dt = ExecuteDataTable(sql, parameters);
        if (dt.Rows.Count == 0) return null;
        return dt.Rows[0];
    }

    /// <summary>
    /// 执行查询,返回第一行第一列(适合 COUNT、SUM、单个字段)
    /// </summary>
    public static object ExecuteScalar(string sql, params SQLiteParameter[] parameters)
    {
        using (var connection = GetConnection())
        {
            connection.Open();
            using (var command = new SQLiteCommand(sql, connection))
            {
                if (parameters != null)
                    command.Parameters.AddRange(parameters);

                return command.ExecuteScalar();
            }
        }
    }

    /// <summary>
    /// 测试数据库连接是否可用
    /// </summary>
    public static bool TestConnection()
    {
        try
        {
            using (var connection = GetConnection())
            {
                connection.Open();
                return true;
            }
        }
        catch
        {
            return false;
        }
    }
}

2、填写数据库配置信息

我这里是直接写在SqliteHelper类里了,也可以在app.config里填写数据库信息。把数据库文件放到\bin\debug\文件夹下。

cs 复制代码
// 数据库连接信息
private static readonly string connectionString =
    "Data Source=" + System.IO.Path.Combine(Application.StartupPath, "c_test.db") + ";Version=3;";

字段说明:

**Data Source:**数据库文件的完整路径。Application.StartupPath会返回exe所在目录,Path.Combine把它和c_test.db拼成完整的路径。

Version: SQLite 的版本号,固定写 3。这是 System.Data.SQLite 要求的,表示使用 SQLite 3 的格式。

3、验证创建成功

cs 复制代码
bool ok = SqliteHelper.TestConnection();
MessageBox.Show(ok ? "数据库连接正常" : "数据库连接失败");

三、CURD操作示例

cs 复制代码
using System;
using System.Data;
using System.Data.SQLite;

class Program
{
    static void Main(string[] args)
    {
        // 1. 查询示例
        Console.WriteLine("查询所有用户:");
        var querySql = "SELECT * FROM user";
        var users = SqliteHelper.ExecuteDataTable(querySql);
        foreach (DataRow row in users.Rows)
        {
            Console.WriteLine($"ID: {row["id"]}, 用户名: {row["username"]}, 状态: {row["status"]}");
        }

        // 2. 插入示例(参数化查询防止SQL注入)
        Console.WriteLine("\n插入新用户:");
        var insertSql = "INSERT INTO user(username, password, status) VALUES(@username, @password, @status)";
        var insertParams = new SQLiteParameter[] {
            new SQLiteParameter("@username", "张三"),
            new SQLiteParameter("@password", "123456"),
            new SQLiteParameter("@status", 1)
        };
        int affectedRows = SqliteHelper.ExecuteNonQuery(insertSql, insertParams);
        Console.WriteLine($"插入成功,影响行数: {affectedRows}");

        // 3. 更新示例
        Console.WriteLine("\n更新用户状态:");
        var updateSql = "UPDATE user SET status = @status WHERE username = @username";
        var updateParams = new SQLiteParameter[] {
            new SQLiteParameter("@status", 2),
            new SQLiteParameter("@username", "张三")
        };
        affectedRows = SqliteHelper.ExecuteNonQuery(updateSql, updateParams);
        Console.WriteLine($"更新成功,影响行数: {affectedRows}");

        // 4. 删除示例
        Console.WriteLine("\n删除用户:");
        var deleteSql = "DELETE FROM user WHERE username = @username";
        var deleteParam = new SQLiteParameter("@username", "张三");
        affectedRows = SqliteHelper.ExecuteNonQuery(deleteSql, deleteParam);
        Console.WriteLine($"删除成功,影响行数: {affectedRows}");

        // 5. 单值查询示例(判断用户是否存在)
        Console.WriteLine("\n查询用户数量:");
        var countSql = "SELECT COUNT(*) FROM user";
        object count = SqliteHelper.ExecuteScalar(countSql);
        Console.WriteLine($"当前用户总数: {count}");

        Console.ReadLine();
    }
}
相关推荐
下页、再停留1 小时前
【C#桌面客户端系列学习-11】将SQLite数据库打包到exe里
数据库·c#·visual studio
LYmatch1 小时前
2024年408真题第41~47题汇总解析
数据库
程序员Sunday1 小时前
Redis 缓存穿透、击穿、雪崩怎么区分?从回源压力找原因
数据库·redis·缓存
我科绝伦(Huanhuan Zhou)1 小时前
磐维数据库(PanWeiDB)日常运维命令总结
运维·数据库
guo_wen_qiang1 小时前
redis实现秒杀功能-超卖&库存遗留问题的解决
数据库·redis·缓存
逐流人1 小时前
Redis内存数据库:从数据类型到集群部署
linux·运维·数据库·redis·缓存·云计算
l1t2 小时前
DeepSeek总结的在 NVIDIA Vera 上对 DuckDB v2.0-dev 进行基准测试
服务器·数据库·sql
渣渣盟2 小时前
2000万QPS背后的存储引擎博弈:InnoDB、MyRocks、WiredTiger到底谁更强?
数据库·mysql
ss2732 小时前
AI时代首先数据库-PostgreSQL实战笔记 | 11 PostgreSQL安装部署常见问题排查与解决
数据库·笔记·postgresql