using System.Data; using DownKyi.Core.Logging; using Microsoft.Data.Sqlite; using Console = DownKyi.Core.Utils.Debugging.Console; namespace DownKyi.Core.Storage.Database; public class DbHelper { private readonly string _connStr; private readonly SqliteConnection? _conn; private static readonly Dictionary Database = new(); /// /// 创建一个数据库 /// /// public DbHelper(string dbPath) { _connStr = new SqliteConnectionStringBuilder { Mode = SqliteOpenMode.ReadWriteCreate, DataSource = dbPath }.ToString(); if (Database.TryGetValue(_connStr, out var value)) { _conn = value; if (_conn != null) { return; } } _conn = new SqliteConnection(_connStr); Database.Add(_connStr, _conn); } /// /// 创建一个带密码的数据库 /// /// /// public DbHelper(string dbPath, string secretKey) { _connStr = new SqliteConnectionStringBuilder { Mode = SqliteOpenMode.ReadWriteCreate, Password = secretKey, DataSource = dbPath }.ToString(); if (Database.TryGetValue(_connStr, out var value)) { _conn = value; if (_conn != null) { return; } } _conn = new SqliteConnection(_connStr); // conn.SetPassword(secretKey); Database.Add(_connStr, _conn); } /// /// 连接是否开启 /// /// public bool IsOpen() { return _conn?.State == ConnectionState.Open; } /// /// 开启连接 /// public void Open() { if (_conn == null) { return; } if (!IsOpen()) { _conn.Open(); } } /// /// 关闭数据库 /// public void Close() { if (_conn == null) { return; } if (!IsOpen()) return; _conn.Close(); Database.Remove(_connStr); } /// /// 执行一条SQL语句 /// /// /// public void ExecuteNonQuery(string sql, Action? action = null) { if (_conn == null) { return; } try { lock (_conn) { Open(); using var tr = _conn.BeginTransaction(); using (var command = _conn.CreateCommand()) { command.CommandText = sql; // 添加参数 action?.Invoke(command.Parameters); command.ExecuteNonQuery(); } tr.Commit(); } } catch (SqliteException e) { Console.PrintLine("DbHelper ExecuteNonQuery()发生异常: {0}", e); LogManager.Error("DbHelper ExecuteNonQuery()", e); } } /// /// 执行一条SQL语句,并执行提供的操作,一般用于查询 /// /// /// public void ExecuteQuery(string sql, Action action) { if (_conn == null) { return; } try { lock (_conn) { Open(); using var command = _conn.CreateCommand(); command.CommandText = sql; var reader = command.ExecuteReader(); action(reader); } } catch (SqliteException e) { Console.PrintLine("DbHelper ExecuteQuery()发生异常: {0}", e); LogManager.Error("DbHelper ExecuteQuery()", e); } } }