Files
ACP/ORM/DatabaseConfig.cs
T

172 lines
6.4 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using SqlSugar;
using System;
using System.IO;
using System.Security.Cryptography;
namespace ORM
{
public class DatabaseConfig
{
/// <summary>
/// 数据库连接类型
/// </summary>
public static DbType DbConnectionType { get; private set; }
/// <summary>
/// SQLite 数据库文件路径
/// </summary>
public static string DbConnectionString { get; private set; }
/// <summary>
/// 数据租户Id
/// </summary>
public static int TenantId { get; private set; }
/// <summary>
/// 雪花算法DatacenterId,值范围:0至31
/// </summary>
public static int SnowFlakeDatacenterId { get; private set; }
/// <summary>
/// 雪花算法WorkID,值范围:0至31
/// </summary>
public static int SnowFlakeWorkId { get; private set; }
#region 不同数据库初始化方法
public static void InitSqlite()
{
DbConnectionType = DbType.Sqlite;
// 获取程序运行目录
string baseDir = AppDomain.CurrentDomain.BaseDirectory;
// 确保 SQLDB 文件夹存在
string folder = Path.Combine(baseDir, "SQLDB");
if (!Directory.Exists(folder))
Directory.CreateDirectory(folder);
// 拼接数据库文件路径
string DBPath = Path.Combine(folder, "SQL.db");
DbConnectionString = $"Data Source={DBPath};";
}
public static void InitMySql(string Server, int Port, string Database, string Uid,string Pwd)
{
DbConnectionType = DbType.MySql;
DbConnectionString =
$"Server={Server};Port={Port};Database={Database};Uid={Uid};Pwd={Pwd};";
}
public static void InitSqlServer(string server,int port,string database,string user,string password)
{
DbConnectionType = DbType.SqlServer;
DbConnectionString =
$"Data Source={server},{port};Initial Catalog={database};user={user};Password={password};";
}
public static void InitSqlServerLocalDb()
{
DbConnectionType = DbType.SqlServer;
string baseDir = AppDomain.CurrentDomain.BaseDirectory;
// 确保 SQLDB 文件夹存在
string folder = Path.Combine(baseDir, "SQLDB");
if (!Directory.Exists(folder))
Directory.CreateDirectory(folder);
// 拼接数据库文件路径
string DBPath = Path.Combine(folder, "SQL.db");
DbConnectionString =$@"Data Source=(localdb)\MSSQLLocalDB;Initial Catalog={DBPath};Integrated Security=True;";
}
#endregion
/// <summary>
/// 设置数据库连接字符串(可手动覆盖)
/// </summary>
public static void SetDbConnection(string strConnection)
{
if (string.IsNullOrEmpty(strConnection))
{
throw new Exception("数据库连接字符串为空");
}
DbConnectionString = strConnection;
}
/// <summary>
/// 设置数据租户Id
/// </summary>
public static void SetTenant(int nTenantId)
{
if (nTenantId <= 10000)
{
throw new Exception("数据租户Id值需大于10000");
}
TenantId = nTenantId;
SetSnowFlake((nTenantId - 10000) % 1024);
}
/// <summary>
/// 将指定数字转换为雪花算法DatacenterId和WorkID
/// </summary>
private static void SetSnowFlake(int nSnowFlakeId)
{
if (nSnowFlakeId > 1023 || nSnowFlakeId < 0)
{
throw new Exception("雪花算法机器码值范围0至1023");
}
SnowFlakeDatacenterId = nSnowFlakeId >> 5;
SnowFlakeWorkId = nSnowFlakeId & 31;
}
/// <summary>
/// 检测数据库连接
/// </summary>
public static void CreateDatabaseAndCheckConnection(bool createDatabase = false, bool checkConnection = false)
{
//数据库不存在则创建数据库
if (createDatabase)
{
SqlSugarContext.DbContext.DbMaintenance.CreateDatabase();
}
// 检查数据库连接
if (checkConnection && !SqlSugarContext.DbContext.Ado.IsValidConnection())
{
throw new Exception("连接数据库失败");
}
}
/// <summary>
/// 归档过期数据库文件:将旧的 SQLite 文件重命名为 "SQL_归档_yyyyMMdd_HHmmss.db"
/// 后续 <see cref="CreateDatabaseAndCheckConnection"/> 会自动创建新的空数据库。
/// <para>
/// 必须在 <see cref="InitSqlite"/> 之后、<see cref="CreateDatabaseAndCheckConnection"/> 之前调用,
/// 此时连接字符串已就绪但数据库文件尚未被打开。
/// </para>
/// </summary>
/// <param name="retentionDays">数据库文件保留天数,默认 180 天(半年)</param>
public static void TryArchiveOldDatabase(int retentionDays = 180)
{
try
{
// 从连接字符串中提取文件路径(格式:Data Source=xxx;
string dbPath = DbConnectionString
.Replace("Data Source=", "", StringComparison.OrdinalIgnoreCase)
.TrimEnd(';');
if (!File.Exists(dbPath)) return;
var cutoff = DateTime.Now.AddDays(-retentionDays);
var fileInfo = new FileInfo(dbPath);
if (fileInfo.LastWriteTime < cutoff)
{
string archiveName = $"SQL_归档_{fileInfo.LastWriteTime:yyyyMMdd_HHmmss}.db";
string archivePath = Path.Combine(fileInfo.DirectoryName!, archiveName);
File.Move(dbPath, archivePath);
System.Diagnostics.Debug.WriteLine(
$"[数据库归档] {dbPath} → {archivePath}(文件最后修改于 {fileInfo.LastWriteTime:yyyy-MM-dd},已超过 {retentionDays} 天)");
}
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine($"数据库归档失败(不影响软件正常使用):{ex.Message}");
}
}
}
}