【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();
    }
}
相关推荐
.痞老板.8 分钟前
mysql初阶--数据库基础
数据库·mysql
城北徐宫1 小时前
MySQL约束条件一览
数据库·mysql
ClouGence3 小时前
数据库变更审批困局,被这个开源工具解决了
数据库·开源
TDengine (老段)4 小时前
TDengine IDMP 十大实用功能(9)
大数据·数据库·人工智能·物联网·时序数据库·tdengine·idmp
starrocks_stella5 小时前
EMR Serverless StarRocks Object Table:用 SQL 连接 OSS 文件与多模态 AI
数据库
这个DBA有点耶5 小时前
以为自增ID只是有空洞?聊聊双主架构下无声的“数据覆盖”
数据库·mysql·dba
钱栈up6 小时前
内网全断,怎么核实高炉和烧结系统的数据库对接信息
数据库
weavecodes6 小时前
双层缓存与权限实时生效:织码在线教育系统的 Caffeine + Redis 设计
数据库
bksczm6 小时前
InnoDB 页结构详解:页类型、页头页尾、数据行与页目录
数据库·mysql
bksczm7 小时前
InnoDB 行格式详解:DYNAMIC / COMPACT / COMPRESSED / REDUNDANT
java·开发语言·数据库