172 lines
6.4 KiB
C#
172 lines
6.4 KiB
C#
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}");
|
||
}
|
||
}
|
||
}
|
||
}
|