添加项目文件。
This commit is contained in:
308
WPFWCSDemo/Utilities/SqlDatabaseMaintenance.cs
Normal file
308
WPFWCSDemo/Utilities/SqlDatabaseMaintenance.cs
Normal file
@@ -0,0 +1,308 @@
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Serilog;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data.SqlClient;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Security.AccessControl;
|
||||
using System.Security.Principal;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
using System.Xml.Linq;
|
||||
using WPFWCSDemo.Data;
|
||||
using WPFWCSDemo.StateCode;
|
||||
|
||||
namespace WPFWCSDemo.Utilities
|
||||
{
|
||||
/// <summary>
|
||||
/// 数据维护操作相关
|
||||
/// </summary>
|
||||
public class SqlDatabaseMaintenance
|
||||
{
|
||||
/// <summary>
|
||||
/// 手动备份根文件夹路径
|
||||
/// </summary>
|
||||
static string rootPath = @"E:\SqlDataBackup";
|
||||
/// <summary>
|
||||
/// 自动备份根文件夹路径
|
||||
/// </summary>
|
||||
static string rootPathAuto = @"E:\SqlAutoBackup";
|
||||
/// <summary>
|
||||
/// sql库名
|
||||
/// </summary>
|
||||
static string dbName = "FT479";
|
||||
|
||||
/// <summary>
|
||||
/// 备份当前数据库
|
||||
/// </summary>
|
||||
public static void SQLBackup()
|
||||
{
|
||||
try
|
||||
{
|
||||
// 连接字符串
|
||||
string connectionString = SqlHelper.ConStr;
|
||||
|
||||
// 指定备份文件的路径
|
||||
string backupPath = $@"{rootPath}\{dbName}_{DateTime.Now.ToString("yyyyMMdd_hhmmss")}.bak";
|
||||
|
||||
// SQL 查询备份数据库
|
||||
string backupQuery = $"BACKUP DATABASE {dbName} TO DISK = '{backupPath}' WITH COPY_ONLY, STATS = 10;";
|
||||
|
||||
|
||||
GetOrCreateDirectory(backupPath);
|
||||
|
||||
// 打开数据库连接
|
||||
using (SqlConnection connection = new SqlConnection(connectionString))
|
||||
{
|
||||
connection.Open();
|
||||
|
||||
// 执行备份查询
|
||||
using (SqlCommand command = new SqlCommand(backupQuery, connection))
|
||||
{
|
||||
command.ExecuteNonQuery();
|
||||
}
|
||||
|
||||
MessageBox.Show("数据库备份成功!");
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBox.Show($"数据库备份失败: {ex.Message}");
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// 自动备份当前数据库
|
||||
/// 包含删除旧数据功能
|
||||
/// </summary>
|
||||
public static void SQLBackupAuto()
|
||||
{
|
||||
try
|
||||
{
|
||||
// 连接字符串
|
||||
string connectionString = SqlHelper.ConStr;
|
||||
|
||||
// 指定备份文件的路径
|
||||
string backupPath = $@"{rootPathAuto}\{DateTime.Now.AddMonths(-4).ToString("yyyy")}\{dbName}_{DateTime.Now.AddMonths(-4).ToString("yyyy-MM")}.bak";
|
||||
|
||||
// SQL 查询备份数据库
|
||||
string backupQuery = $"BACKUP DATABASE {dbName} TO DISK = '{backupPath}' WITH COPY_ONLY, STATS = 10;";
|
||||
|
||||
GetOrCreateDirectory(backupPath);
|
||||
|
||||
Log.Warning("【定期自动备份】自动备份数据中...");
|
||||
|
||||
using var context = new AppDbContext();
|
||||
|
||||
//备份前删除前3个月外的调度任务记录
|
||||
context.TaskHistories
|
||||
.Where(t => t.FinishTime < DateTime.Now.AddMonths(-3))
|
||||
.ExecuteDelete();
|
||||
|
||||
//备份前删除前1年前的报警任务记录
|
||||
context.AlarmHistories
|
||||
.Where(t => t.End_Time < DateTime.Now.AddYears(-1))
|
||||
.ExecuteDelete();
|
||||
|
||||
context.SaveChanges();
|
||||
|
||||
// 打开数据库连接
|
||||
using (SqlConnection connection = new SqlConnection(connectionString))
|
||||
{
|
||||
connection.Open();
|
||||
|
||||
// 执行备份查询
|
||||
using (SqlCommand command = new SqlCommand(backupQuery, connection))
|
||||
{
|
||||
command.ExecuteNonQuery();
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Log.Warning("【定期自动备份】备份完成!");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Log.Warning($"【定期自动备份】备份发生错误:{ex.Message}");
|
||||
}
|
||||
|
||||
SqlHelper.NewEventLog("系统自动备份操作", "SYSTEM");
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// SQL备份-调度任务表
|
||||
/// </summary>
|
||||
public static void SQLTaskBackup(string yearOrMonthOrDay,int count,bool delete)
|
||||
{
|
||||
try
|
||||
{
|
||||
// 连接字符串
|
||||
string connectionString = SqlHelper.ConStr;
|
||||
|
||||
// 指定备份文件的路径
|
||||
string backupPath = $"{rootPath}\\{dbName}_{DateTime.Now.ToString("yyyyMMdd_hhmmss")}.bak";
|
||||
|
||||
// SQL 查询备份数据库
|
||||
string backupQuery = $"BACKUP DATABASE FT_WCS TO DISK = '{backupPath}' WITH COPY_ONLY, STATS = 10;" +
|
||||
$"SELECT * FROM TASK_HISTORY WHERE CREATETIME >= DATEADD({yearOrMonthOrDay}, {count}, GETDATE())";
|
||||
|
||||
|
||||
GetOrCreateDirectory(backupPath);
|
||||
|
||||
// 打开数据库连接
|
||||
using (SqlConnection connection = new SqlConnection(connectionString))
|
||||
{
|
||||
connection.Open();
|
||||
|
||||
// 执行备份查询
|
||||
using (SqlCommand command = new SqlCommand(backupQuery, connection))
|
||||
{
|
||||
command.ExecuteNonQuery();
|
||||
|
||||
//选择是否删除已备份的数据
|
||||
if (delete)
|
||||
{
|
||||
SQLClearByTime("TASK_HISTORY", yearOrMonthOrDay, count);
|
||||
}
|
||||
}
|
||||
|
||||
MessageBox.Show("数据库备份成功!");
|
||||
|
||||
Log.Warning($"【手动动备份】备份完成!");
|
||||
}
|
||||
|
||||
SqlHelper.NewEventLog("发生了手动备份操作", "USER");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBox.Show($"数据库备份失败: {ex.Message}");
|
||||
|
||||
Log.Warning($"【手动备份】备份发生错误:{ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// SQL备份-历史报警表
|
||||
/// </summary>
|
||||
public static void SQLAlarmBackup(string yearOrMonthOrDay, int count,bool delete)
|
||||
{
|
||||
try
|
||||
{
|
||||
// 连接字符串
|
||||
string connectionString = SqlHelper.ConStr;
|
||||
|
||||
// 指定备份文件的路径
|
||||
string backupPath = $"{rootPath}\\{dbName}_{DateTime.Now.ToString("yyyyMMdd_hhmmss")}.bak";
|
||||
|
||||
// SQL 查询备份数据库
|
||||
string backupQuery = $"BACKUP DATABASE FT_WCS TO DISK = '{backupPath}' WITH COPY_ONLY, STATS = 10;" +
|
||||
$"SELECT * FROM ALARM_LOG WHERE GEN_TIME >= DATEADD({yearOrMonthOrDay}, {count}, GETDATE())";
|
||||
|
||||
GetOrCreateDirectory(backupPath);
|
||||
|
||||
// 打开数据库连接
|
||||
using (SqlConnection connection = new SqlConnection(connectionString))
|
||||
{
|
||||
connection.Open();
|
||||
|
||||
// 执行备份查询
|
||||
using (SqlCommand command = new SqlCommand(backupQuery, connection))
|
||||
{
|
||||
command.ExecuteNonQuery();
|
||||
|
||||
//选择是否删除已备份的数据
|
||||
if (delete)
|
||||
{
|
||||
SQLClearByTime("ALARM_LOG", yearOrMonthOrDay, count);
|
||||
}
|
||||
}
|
||||
|
||||
MessageBox.Show("数据库备份成功!");
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBox.Show($"数据库备份失败: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 删除SQL数据
|
||||
/// </summary>
|
||||
public static void SQLClearByTime(string tableName, string yearOrMonthOrDay, int count)
|
||||
{
|
||||
SqlHelper.ExecuteNonQuery($"DELETE FROM {tableName} WHERE GEN_TIME >= DATEADD({yearOrMonthOrDay}, {count}, GETDATE()");
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 查找文件夹(不存在则创建)
|
||||
/// 查找后为文件夹设定权限-完全控制
|
||||
/// </summary>
|
||||
/// <param name="backupPath"></param>
|
||||
private static void GetOrCreateDirectory(string backupPath)
|
||||
{
|
||||
// 检查备份路径是否存在,如果不存在则创建
|
||||
if (!Directory.Exists(Path.GetDirectoryName(backupPath)))
|
||||
{
|
||||
Directory.CreateDirectory(Path.GetDirectoryName(backupPath));
|
||||
|
||||
try
|
||||
{
|
||||
// 定义文件夹路径
|
||||
string folderPath = rootPath;
|
||||
|
||||
// 获取文件夹信息
|
||||
DirectoryInfo directoryInfo = new DirectoryInfo(folderPath);
|
||||
|
||||
// 获取当前文件夹的安全性设置
|
||||
DirectorySecurity directorySecurity = directoryInfo.GetAccessControl();
|
||||
|
||||
// 定义 "Authenticated Users" 用户组
|
||||
NTAccount authenticatedUsers = new NTAccount("Authenticated Users");
|
||||
|
||||
// 定义权限(这里使用读取和执行权限)
|
||||
FileSystemRights fileSystemRights = FileSystemRights.FullControl;
|
||||
|
||||
// 定义授权类型
|
||||
InheritanceFlags inheritanceFlags = InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit;
|
||||
PropagationFlags propagationFlags = PropagationFlags.None;
|
||||
AccessControlType accessControlType = AccessControlType.Allow;
|
||||
|
||||
// 创建权限规则
|
||||
FileSystemAccessRule rule = new FileSystemAccessRule(authenticatedUsers, fileSystemRights, inheritanceFlags, propagationFlags, accessControlType);
|
||||
|
||||
// 添加权限规则到文件夹的安全性设置
|
||||
directorySecurity.AddAccessRule(rule);
|
||||
|
||||
// 设置新的安全性设置到文件夹
|
||||
directoryInfo.SetAccessControl(directorySecurity);
|
||||
|
||||
//Console.WriteLine("权限已成功添加到文件夹: " + folderPath);
|
||||
}
|
||||
catch
|
||||
{
|
||||
//Console.WriteLine("添加权限失败: " + ex.Message);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user