NetCore中将SQLServer数据库备份为Sql脚本

描述:

最近写项目收到了一个需求, 就是将SQL Server数据库备份为Sql脚本, 如果是My Sql之类的还好说, 但是在网上搜了一大堆, 全是教你怎么操作SSMS的, 就很d疼!

解决方案:

通过各种查找资料, 还有一些老哥的帮助, 找到了解决方案:

通过Microsoft.SqlServer.Management.Smo, Microsoft.SqlServer.Management.Sdk.Sfc, Microsoft.SqlServer.Management.Common来解决, 但是不巧的是, 这个方法可能只适用于.Net Framework, 并且微软已经提供一个合集的类库封装为Microsoft.SqlServer.Scripts. 但是我是一个Net5的项目!

但是最后还是找到了, 微软封装了一个其它包...emmMicrosoft.SqlServer.SqlManagementObjects, 此类库可以适用于Net Core.

By: 胖纸不争

NetCore群: 743336452

基本使用

Server server = new Server(
new ServerConnection(
// 服务器IP
_dbBackupOptions.ServerInstance,
// 登录名
_dbBackupOptions.Username,
// 密码
_dbBackupOptions.Password
)
);
// 获取数据库
Database templateDb = server.Databases[_dbBackupOptions.DatabaseName];
// 脚本导出路径
string sqlFilePath = string.Format("{0}.sql", $"{dbBackupPath}/{name}");
// 自定义规则
var startWith = _dbBackupOptions.FormatTables.Where(x => x.EndsWith("*")).Select(x => x.TrimEnd('*'));
var endWith = _dbBackupOptions.FormatTables.Where(x => x.StartsWith("*")).Select(x => x.TrimStart('*')); if (_dbBackupOptions.FormatTables is not null && _dbBackupOptions.FormatTables.Any())
{
foreach (Table tb in templateDb.Tables)
{
if (_dbBackupOptions.FormatTables.Contains(tb.Name) ||
startWith.Where(x => tb.Name.StartsWith(x)).Any() ||
endWith.Where(x => tb.Name.EndsWith(x)).Any())
{
// 按表获取Sql
IEnumerable<string> sqlStrs = tb.EnumScript(_dbBackupOptions.ScriptingOptions);
// 将Sql向文件中追加
using (StreamWriter sw = new StreamWriter(sqlFilePath, true, Encoding.UTF8))
{
foreach (var sql in sqlStrs)
{
sw.WriteLine(sql);
sw.WriteLine("GO");
}
}
}
}
}
else
{
foreach (Table tb in templateDb.Tables)
{
IEnumerable<string> sqlStrs = tb.EnumScript(_dbBackupOptions.ScriptingOptions);
using (StreamWriter sw = new StreamWriter(sqlFilePath, true, Encoding.UTF8))
{
foreach (var sql in sqlStrs)
{
sw.WriteLine(sql);
sw.WriteLine("GO");
}
}
}
}

开箱即用(封装库Powers.DbBackup)

我针对这个封装了一个类库, Powers.DBackup方便简单使用.

GitHub地址: Powers.DbBackup

配置DbBackup

1. In Startup.cs(Net5):

services.AddDbBackup();

appsettings.json:

"DbBackupOptions": {
// remote server
"ServerInstance": "192.168.31.36",
// database username
"Username": "sa",
// password
"Password": "sa123.",
// ddatabase name
"DatabaseName": "PumInfoShop",
// output options
"ScriptingOptions": {
"DriAll": false,
"ScriptSchema": true,
"ScriptData": true,
"ScriptDrops": false
},
// match rules
/**
* Include 3 rules:
* 1. Full name: UserTable
* 2. Start with: Sys*
* 3. End with: *Table
*/
"FormatTables": []
}

OR

services.AddDbBackup(opts =>
{
opts.ServerInstance = "127.0.0.1";
opts.Username = "sa";
opts.Password = "123456";
opts.DatabaseName = "TestDb";
opts.ScriptingOptions = new ScriptingOptions
{
DriAll = true,
ScriptSchema = true,
ScriptData = true,
ScriptDrops = false
};
/**
* Include 3 rules:
* 1. Full name: UserTable
* 2. Start with: Sys*
* 3. End with: *Table
*/
opts.FormatTables = new string[] { "Sys*", "Log*", "UserTable", "*Table" };
});
// Or this way
//services.AddDbBackup(opts => new DbBackupOptions
//{
// ServerInstance = "127.0.0.1",
// Username = "sa",
// // .....
//});

2. In Program.cs(Net6):

builder.Services.AddDbBackup();

appsettings.json:

"DbBackupOptions": {
"ServerInstance": "192.168.31.36",
"Username": "sa",
"Password": "sa123.",
"DatabaseName": "PumInfoShop",
"ScriptingOptions": {
"DriAll": false,
"ScriptSchema": true,
"ScriptData": true,
"ScriptDrops": false
},
"FormatTables": []
}

OR

builder.Services.AddDbBackup(opts =>
{
opts.ServerInstance = "127.0.0.1";
opts.Username = "sa";
opts.Password = "123456";
opts.DatabaseName = "TestDb";
opts.ScriptingOptions = new ScriptingOptions
{
DriAll = true,
ScriptSchema = true,
ScriptData = true,
ScriptDrops = false
};
/**
* Include 3 rules:
* 1. Full name: UserTable
* 2. Start with: Sys*
* 3. End with: *Table
*/
opts.FormatTables = new string[] { "Sys*", "Log*", "UserTable", "*Table" };
}); // Or this way
//builder.Services.AddDbBackup(opts => new DbBackupOptions
//{
// ServerInstance = "127.0.0.1",
// Username = "sa",
// // .....
//});

使用方法

[HttpGet]
public async Task<ActionResult> StartDbBackup()
{
var rootPath = "D:/";
var fileName = DateTime.Now.ToString("yyyyMMddhhmmss"); // No ".sql" suffix is required.
var (path, size) = await DbBackupExtensions.StartBackupAsync(rootPath, fileName);// path is full path return Ok(new
{
Path = path,
Size = size
});
} [HttpGet]
public async Task<ActionResult> DeleteDbBackup(string filePath)
{
var (res, msg) = await DbBackupExtensions.DeleteBackup(filePath); if (res)
{
return Ok(msg);
}
else
{
return NotFound(msg);
}
}

[SQLServer]NetCore中将SQLServer数据库备份为Sql脚本的更多相关文章

  1. 数据库备份及SQL脚本导入

    数据库备份及SQL脚本导入 数据导出 su - oracle exp 数据库用户名/数据库密码@ORCL file=20190905.dmp full=y SQL脚本导入 首先导入前查看Oracle用 ...

  2. [SQL SERVER] - 还原数据库备份(SQL脚本),抛出 "System.OutOfMemoryException" 异常之解决

    背景 在 Microsoft SQL Server 2016 的查询窗体中,直接还原备份数据库的 SQL 脚本(99MB),抛出 Cannot execute script 异常: 原因 相关资料说: ...

  3. .net(C#)在Access数据库中执行sql脚本

    自己写的一个工具类,主要是业务场景的需要. 主要有两个功能: ①执行包含sql语句的字符串 ②执行包含sql语句的文件 调用方式 /// <summary> /// 执行sql语句 /// ...

  4. SQL server 数据库备份还原Sql

    /************ 一.数据库备份 ************/ --完整备份默认追加到现有的文件 backup database DBXS To disk='d:\backup\DBXS_fu ...

  5. sqlserver2008数据库自动备份的sql脚本及使用bat命令执行脚本

    -----sql脚本 declare @fileName varchar(255) ,--定义备份文件名变量         @dbname varchar(255)--定义备份数据库名变量decla ...

  6. SQL Server2019数据库备份与还原脚本,数据库可批量备份

    前言 最近公司服务器到期,需要进行数据迁移,而数据库属于多而繁琐,通过图形化界面一个一个备份所需时间成本很大,所以想着写一个sql脚本来执行. 开始 数据库单个备份 数据库批量备份 数据库还原 数据库 ...

  7. linux系统下mySQL数据库 备份方法和脚本

    数据库备份1.创建个备份存储目录mkdir /root/backup/2.以下内容写到dbbackup.sh #!/bin/bash cd /data/db_backup/mysqldump -uad ...

  8. MySQL必知必会-官方数据库表及SQL脚本导入生成

    最近在复习SQL语句,看的是MySQL必知必会这本书,但是发现附录中只有表设计,没有表的具体数据.所以在学习相应的语句中体验不是很好,去网上查了数据库的内容,自己慢慢导入到了数据库中.把表放出来作为参 ...

  9. 使用PD(PowerDesigner)图如何快速生成创建数据库表的SQL脚本

    打开PD软件: 1.新建概念模型(conceptual Data Model) File-->New Model-->Conceptual Data Mode 或者点击工作区,右键--&g ...

随机推荐

  1. 【静态页面架构】CSS之定位

    CSS架构 1.浮动: 是以float属性设置容器指定的位置 <style> div { width: 200px; height: 200px; } #qq { background-c ...

  2. 前端每日实战:116# 视频演示如何用 CSS 和原生 JS 开发一个监控网络连接状态的页面

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/oPjWvw 可交互视频 此视频是可 ...

  3. Idea中配置Tomcat以及运行maven项目

    maven安装和详细配置 提示:下面是Tomcat9.0版本的下载链接,需要其他版本的去官方网站下载. 链接:https://pan.baidu.com/s/1CONf8KVXM4gyJj4pxjFB ...

  4. linux ping的三个数字(56,84,64)

    参考:ping 深入剖析:https://www.cnblogs.com/aozhejin/p/15917312.html windows默认是32字节,linux是56字节说的都是数据包大小注意:1 ...

  5. Servlet 3.1学习笔记

    Servlet 3.1学习笔记 参考文档 Servlet 3.1标准 什么是 Servlet ? Servlet 是基于 Java 平台的 Web 组件,由一个容器管理,能够生成动态内容. 什么是 S ...

  6. 记一次线上websocket返回400问题排查

    现象 生产环境websocket无法正常连接,服务端返回400 bad request,开发及测试环境均正常. 抓包排查 src:nginx服务器 172.16.177.193dst:imp应用服务器 ...

  7. 基于docker搭建laravel项目

    基于docker搭建laravel项目 公司PHP项目是Laravel框架写的,目前环境需要通过docker来部署一下.网上学习了一下相关知识.整理后做一个笔记.用到定时任务crontab与进程管理s ...

  8. 得到一个a(10)到b(20)的随机数。包括10和20

  9. synchronized有几种用法?

    在 Java 语言中,保证线程安全性的主要手段是加锁,而 Java 中的锁主要有两种:synchronized 和 Lock,我们今天重点来看一下 synchronized 的几种用法. 用法简介 使 ...

  10. 计算属性、侦听属性、局部与全局组件使用、组件通信(父子互传)、ref属性、动态组件和keep-alive、插槽

    今日内容概要 计算属性 侦听属性 局部组件和全局组件 组件通信之父传子 组件通信之子传父 ref属性(组件间通信) 动态组件和keep-alive 插槽 内容详细 1.计算属性 # 插值的普通函数,只 ...