c# 备份与还原数据
0 条评论数据库表
CREATE TABLE [dbo].[Sys_Backup](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](500) NULL,
[Version] [nvarchar](500) NULL,
[BackupFileName] [nvarchar](500) NULL,
[BackupTime] [datetime] NULL,
[LastRestoreTime] [datetime] NULL,
[Description] [nvarchar](2000) NULL,
CONSTRAINT [PK_Sys_Backup] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
程序
/// <summary>
/// 创建数据备份请求对象
/// </summary>
public class DataBackupRequestDto
{
/// <summary>
/// 数据备份名称
/// </summary>
[Required]
[MaxLength(30, ErrorMessage = "最大长度30个字符")]
public string Name { get; set; }
/// <summary>
/// 数据备份描述
/// </summary>
[Required]
[MaxLength(100, ErrorMessage = "最大长度100个字符")]
public string Description { get; set; }
}
/// <summary>
/// 备份数据库
/// </summary>
/// <returns></returns>
public ApiResult AddBackup(DataBackupRequestDto request, int userId, string serverpath)
{
using var connection = SqlHelper.GetDBConnection();
string filename = Guid.NewGuid().ToString();
if (!System.IO.Directory.Exists(serverpath + "\\dbback\\"))
{
System.IO.Directory.CreateDirectory(serverpath + "\\dbback\\");
}
string pathName = serverpath.TrimEnd('\\') + "\\dbback\\" + filename + ".bak";
var tablelist = connection.Query<String>("select name from sysobjects where xtype='U' order by name").AsList();
StringBuilder sql = new StringBuilder();
for (int i = 0; i < tablelist.Count; i++)
{
if (tablelist[i].ToLower() == "sys_backup" || tablelist[i].ToLower() == "upgrade"|| tablelist[i].ToLower() == "sysdiagrams")
{
continue;
}
var identitynum = connection.QuerySingle<int>("select COUNT(1) from syscolumns where id=Object_Id('" + tablelist[i] + "') and COLUMNPROPERTY( id,name,'IsIdentity')=1");
var colname = connection.Query<String>("select name from syscolumns where id=Object_Id('" + tablelist[i] + "')").AsList();
List<string> colname2 = new List<string>();
for (int k = 0; k < colname.Count; k++)
{
colname2.Add("[" + colname[k] + "]");
}
string field = string.Join(",", colname2.ToArray());
string dataquery = "select " + field + " from [" + tablelist[i]+"]";
DataTable dt = new DataTable();
dt.Load(connection.ExecuteReader(dataquery));
if (dt.Rows.Count > 0)
{
sql.AppendLine("TRUNCATE table [" + tablelist[i] + "];");
if (identitynum > 0)
{
sql.AppendLine("SET IDENTITY_INSERT [dbo].[" + tablelist[i] + "] ON;");
}
}
for (int j = 0; j < dt.Rows.Count; j++)
{
StringBuilder sqldata = new StringBuilder();
for (int k = 0; k < colname.Count; k++)
{
string celldata = dt.Rows[j][colname[k]].ToString();
if (celldata == "")
{
sqldata.Append("NULL");
}
else
{
sqldata.Append("'" + dt.Rows[j][colname[k]].ToString().Replace("'", "''").Replace("\r", "").Replace("\n", "") + "'");
}
if (k != colname.Count - 1)
{
sqldata.Append(",");
}
}
sql.AppendLine("INSERT [dbo].[" + tablelist[i] + "] (" + field + ") VALUES (" + sqldata + ");");
}
if (dt.Rows.Count > 0)
{
if (identitynum > 0)
{
sql.AppendLine("SET IDENTITY_INSERT [dbo].[" + tablelist[i] + "] OFF;");
}
}
}
StreamWriter sw = File.CreateText(pathName);
sw.Write(sql.ToString()); //写入文件中
sw.Flush();//清理缓冲区
sw.Close();//关闭文件
int? id = connection.Insert<Sys_Backup>(new Sys_Backup { BackupFileName = "\\dbback\\" + filename + ".bak", Version="v1.0", Description = request.Description, Name = request.Name, BackupTime = DateTime.Now });
if (id.Value > 0)
{
return new ApiResult() { Success=true };
}
return new ApiResult() { Success = false };
}
/// <summary>
/// 还原数据库
/// </summary>
/// <param name="backupid"></param>
/// <returns></returns>
public ApiResult RestoreBackup( int backupid,int userid, string serverpath)//int backupId, int userId,string serverpath
{
using (var conn = SqlHelper.GetDBConnection())
{
var model = conn.Get<Sys_Backup>(backupid);
if (model == null)
{
return new ApiResult() { Success = false };
}
string dbpath = model.BackupFileName;
StreamReader reader = new StreamReader(serverpath + dbpath, Encoding.UTF8);
string sql = reader.ReadToEnd();
reader.Close();
int result = -1;
var tran = conn.BeginTransaction();
try
{
result = conn.Execute(sql, new { }, tran);
tran.Commit();
}
catch (Exception e)
{
tran.Rollback();
}
if (result > 0)
{
conn.Execute("update Sys_Backup set LastRestoreTime=GETDATE() where id=" + backupid);
return new ApiResult() { Success = true };
}
return new ApiResult() { Success=false};
}
}