【问题标题】:C# - Generate Database Backup Script In-MemoryC# - 在内存中生成数据库备份脚本
【发布时间】:2020-02-29 12:48:27
【问题描述】:

在 C# 应用程序中,我知道使用 ADO.NET 我们可以执行如下备份命令:

BACKUP DATABASE MyDb TO DISK='C:\\MyDb.bak'

并进行数据库备份并将其存储在某个给定位置。

我想备份内存中的数据库,即返回备份脚本内容(模式和数据),稍后我可以将其保存为 .sql 文件在某个位置。

这可能吗?

【问题讨论】:

  • T-SQL 中的BACKUP DATABASE 命令确实返回基于 SQL 的“脚本文件”或任何东西 - 它是专有的 二进制文件仅限格式。
  • 是的。我知道的。这里我的意思是将我们生成脚本时获得的模式和数据返回到新窗口
  • 正如我所说 - 你不能为此使用BACKUP DATABASE。没有选项或开关可以使此命令返回 SQL 脚本以创建数据库对象并填写数据....
  • 我的主要问题是用于 SQL 的用户没有运行权限,即在磁盘上创建任何物理文件。所以我想在内存中获取架构和数据
  • 要备份数据库,最简单的方法是进行 Deattach。然后将 MDF 文件复制到 windows 中。最后将 MDF 文件重新附加到服务器。仅当您要备份数据库的各个部分时,备份才有用。对于大文件,我会推荐一种 SQL 命令行工具。请参阅:docs.microsoft.com/en-us/sql/tools/…

标签: c# asp.net sql-server asp.net-mvc


【解决方案1】:

我使用 SQL Server 管理对象 (SMO) 实现了它。感谢所有帮助cmets的朋友。

首先,从 nuget 包管理器安装 Microsoft.SqlServer.SqlManagementObjects

工作代码:

using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management.Common;

var script = new StringBuilder();

Server server = new Server(new ServerConnection(new SqlConnection(connectionString)));
Database database = server.Databases[databaseName];
ScriptingOptions options = new ScriptingOptions
{
    ScriptData = true,
    ScriptSchema = true,
    ScriptDrops = false,
    Indexes = true,
    IncludeHeaders = true
};

foreach (Table table in database.Tables)
{
    foreach (var statement in table.EnumScript(options))
    {
        script.Append(statement);
        script.Append(Environment.NewLine);
    }
}

File.WriteAllText(backupPath + databaseName + ".sql", script.ToString());

【讨论】:

    猜你喜欢
    • 2016-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多