using SqlSugar; using System; using System.IO; using System.Security.Cryptography; namespace ORM { public class DatabaseConfig { /// /// 数据库连接类型 /// public static DbType DbConnectionType { get; private set; } /// /// SQLite 数据库文件路径 /// public static string DbConnectionString { get; private set; } /// /// 数据租户Id /// public static int TenantId { get; private set; } /// /// 雪花算法DatacenterId,值范围:0至31 /// public static int SnowFlakeDatacenterId { get; private set; } /// /// 雪花算法WorkID,值范围:0至31 /// 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 /// /// 设置数据库连接字符串(可手动覆盖) /// public static void SetDbConnection(string strConnection) { if (string.IsNullOrEmpty(strConnection)) { throw new Exception("数据库连接字符串为空"); } DbConnectionString = strConnection; } /// /// 设置数据租户Id /// public static void SetTenant(int nTenantId) { if (nTenantId <= 10000) { throw new Exception("数据租户Id值需大于10000"); } TenantId = nTenantId; SetSnowFlake((nTenantId - 10000) % 1024); } /// /// 将指定数字转换为雪花算法DatacenterId和WorkID /// private static void SetSnowFlake(int nSnowFlakeId) { if (nSnowFlakeId > 1023 || nSnowFlakeId < 0) { throw new Exception("雪花算法机器码值范围0至1023"); } SnowFlakeDatacenterId = nSnowFlakeId >> 5; SnowFlakeWorkId = nSnowFlakeId & 31; } /// /// 检测数据库连接 /// 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("连接数据库失败"); } } /// /// 归档过期数据库文件:将旧的 SQLite 文件重命名为 "SQL_归档_yyyyMMdd_HHmmss.db", /// 后续 会自动创建新的空数据库。 /// /// 必须在 之后、 之前调用, /// 此时连接字符串已就绪但数据库文件尚未被打开。 /// /// /// 数据库文件保留天数,默认 180 天(半年) 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}"); } } } }