mirror of
https://github.com/yaobiao131/downkyicore.git
synced 2025-08-10 00:52:31 +00:00
179 lines
4.2 KiB
C#
179 lines
4.2 KiB
C#
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<string, SqliteConnection> database = new();
|
|
|
|
/// <summary>
|
|
/// 创建一个数据库
|
|
/// </summary>
|
|
/// <param name="dbPath"></param>
|
|
public DbHelper(string dbPath)
|
|
{
|
|
connStr = new SqliteConnectionStringBuilder
|
|
{
|
|
Mode = SqliteOpenMode.ReadWriteCreate,
|
|
DataSource = dbPath
|
|
}.ToString();
|
|
if (database.ContainsKey(connStr))
|
|
{
|
|
conn = database[connStr];
|
|
|
|
if (conn != null)
|
|
{
|
|
return;
|
|
}
|
|
}
|
|
|
|
conn = new SqliteConnection(connStr);
|
|
database.Add(connStr, conn);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 创建一个带密码的数据库
|
|
/// </summary>
|
|
/// <param name="dbPath"></param>
|
|
/// <param name="secretKey"></param>
|
|
public DbHelper(string dbPath, string secretKey)
|
|
{
|
|
connStr = new SqliteConnectionStringBuilder
|
|
{
|
|
Mode = SqliteOpenMode.ReadWriteCreate,
|
|
Password = secretKey,
|
|
DataSource = dbPath
|
|
}.ToString();
|
|
if (database.ContainsKey(connStr))
|
|
{
|
|
conn = database[connStr];
|
|
|
|
if (conn != null)
|
|
{
|
|
return;
|
|
}
|
|
}
|
|
|
|
conn = new SqliteConnection(connStr);
|
|
// conn.SetPassword(secretKey);
|
|
database.Add(connStr, conn);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 连接是否开启
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
public bool IsOpen()
|
|
{
|
|
return conn.State == ConnectionState.Open;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 开启连接
|
|
/// </summary>
|
|
public void Open()
|
|
{
|
|
if (conn == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (!IsOpen())
|
|
{
|
|
conn.Open();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 关闭数据库
|
|
/// </summary>
|
|
public void Close()
|
|
{
|
|
if (conn == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (IsOpen())
|
|
{
|
|
conn.Close();
|
|
|
|
database.Remove(connStr);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 执行一条SQL语句
|
|
/// </summary>
|
|
/// <param name="sql"></param>
|
|
public void ExecuteNonQuery(string sql, Action<SqliteParameterCollection> 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);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 执行一条SQL语句,并执行提供的操作,一般用于查询
|
|
/// </summary>
|
|
/// <param name="sql"></param>
|
|
/// <param name="action"></param>
|
|
public void ExecuteQuery(string sql, Action<SqliteDataReader> 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);
|
|
}
|
|
}
|
|
} |