当前位置:首页 > 行业动态 > 正文

如何用C将类数据高效存储至SQLite数据库?

在C#中通过ORM框架(如Entity Framework或Dapper)将类对象存储到SQLite数据库,需定义实体类与数据表结构映射,配置数据库连接,并实现增删改查操作,SQLite作为轻量级嵌入式数据库,适用于本地数据存储,结合C#可实现高效的类对象持久化方案。

环境配置与依赖库安装

  1. 安装NuGet包
    通过Visual Studio的NuGet包管理器安装以下库:

    • Microsoft.Data.Sqlite:微软官方提供的轻量级SQLite操作库
    • System.Data.Common:支持基础数据库操作

    命令:

    Install-Package Microsoft.Data.Sqlite
  2. 引用命名空间

    using Microsoft.Data.Sqlite;
    using System.Data;

定义实体类

假设需要存储用户信息,先创建对应类:

public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
    public DateTime RegisterTime { get; set; }
}

关键点

  • 属性名称与数据库字段建议保持一致(可通过[Column("字段名")]自定义映射)
  • 推荐为类添加无参构造函数,避免ORM映射异常

创建数据库与连接

// 连接字符串(数据库文件不存在时会自动创建)
string connectionString = "Data Source=users.db";
using var connection = new SqliteConnection(connectionString);
connection.Open();

路径说明

  • 绝对路径:Data Source=C:/data/users.db
  • 相对路径:Data Source=./AppData/users.db
  • 内存数据库:Data Source=:memory:(仅临时存储)

创建数据表

string createTableSql = @"
    CREATE TABLE IF NOT EXISTS Users (
        Id INTEGER PRIMARY KEY AUTOINCREMENT,
        Name TEXT NOT NULL,
        Email TEXT UNIQUE,
        RegisterTime DATETIME DEFAULT CURRENT_TIMESTAMP
    )";
using var command = new SqliteCommand(createTableSql, connection);
command.ExecuteNonQuery();

字段类型对照
| C#类型 | SQLite类型 |
|—————–|————-|
| int/long | INTEGER |
| string | TEXT |
| DateTime | DATETIME |
| bool | BOOLEAN |


实现CRUD操作

插入数据

public void InsertUser(User user)
{
    string sql = @"INSERT INTO Users (Name, Email) 
                   VALUES (@name, @email)";
    using var command = new SqliteCommand(sql, connection);
    command.Parameters.AddWithValue("@name", user.Name);
    command.Parameters.AddWithValue("@email", user.Email);
    command.ExecuteNonQuery();
    // 获取自增ID
    user.Id = (int)connection.LastInsertRowId;
}

查询数据

public User GetUserById(int id)
{
    string sql = "SELECT * FROM Users WHERE Id = @id";
    using var command = new SqliteCommand(sql, connection);
    command.Parameters.AddWithValue("@id", id);
    using var reader = command.ExecuteReader();
    if (reader.Read())
    {
        return new User
        {
            Id = reader.GetInt32(0),
            Name = reader.GetString(1),
            Email = reader.GetString(2),
            RegisterTime = reader.GetDateTime(3)
        };
    }
    return null;
}

更新数据

public void UpdateUserEmail(int id, string newEmail)
{
    string sql = "UPDATE Users SET Email = @email WHERE Id = @id";
    using var command = new SqliteCommand(sql, connection);
    command.Parameters.AddWithValue("@email", newEmail);
    command.Parameters.AddWithValue("@id", id);
    command.ExecuteNonQuery();
}

删除数据

public void DeleteUser(int id)
{
    string sql = "DELETE FROM Users WHERE Id = @id";
    using var command = new SqliteCommand(sql, connection);
    command.Parameters.AddWithValue("@id", id);
    command.ExecuteNonQuery();
}

事务处理

using var transaction = connection.BeginTransaction();
try
{
    // 执行多个操作
    InsertUser(user1);
    UpdateUserEmail(2, "new@example.com");
    transaction.Commit();
}
catch (Exception ex)
{
    transaction.Rollback();
    // 记录日志
}

异常处理建议

  1. 捕获特定异常类型:

    try {
        // 数据库操作
    }
    catch (SqliteException ex) {
        // 处理主键冲突、连接失败等
    }
    catch (InvalidOperationException ex) {
        // 处理连接状态错误
    }
  2. 建议记录完整日志,包含:

    • 执行的SQL语句
    • 错误代码(ex.SqliteErrorCode
    • 堆栈跟踪信息

性能优化策略

  1. 连接池优化

    // 在连接字符串中添加池化配置
    string connectionString = "Data Source=users.db;Pooling=True;Max Pool Size=100";
  2. 索引优化

    CREATE INDEX idx_users_email ON Users(Email);
  3. 批量操作
    使用参数化查询批量插入数据,减少解析开销。

  4. 异步操作

    public async Task InsertUserAsync(User user)
    {
        using var command = new SqliteCommand(sql, connection);
        await command.ExecuteNonQueryAsync();
    }
  5. 数据库维护
    定期执行VACUUM命令整理碎片:

    new SqliteCommand("VACUUM", connection).ExecuteNonQuery();

扩展建议

  1. 使用ORM框架
    如需简化操作,可采用Dapper或Entity Framework Core:

    • Dapper示例:
      connection.Execute("INSERT INTO Users (...) VALUES (...)", user);
  2. 加密数据库
    通过SQLCipher扩展实现数据库加密:

    string connectionString = "Data Source=encrypted.db;Password=MySecretKey";
  3. 跨平台部署
    SQLite支持Windows/Linux/macOS,需确保目标系统有SQLite.Interop.dll依赖项。


引用说明

本文代码示例基于Microsoft.Data.Sqlite 7.0官方文档实现,SQLite语法参考自SQLite官方规范(2025版),性能优化策略参考数据库优化白皮书及Stack Overflow社区最佳实践。

0