【问题标题】:Backup SQL Server via C#通过 C# 备份 SQL Server
【发布时间】:2010-10-14 11:20:40
【问题描述】:

通过 C# 代码备份 SQL Server 数据库有多容易?

我看到很多相关的问题,但没有真正的答案。

【问题讨论】:

  • 您是要备份整个数据库还是部分数据库?

标签: c# sql sql-server backup


【解决方案1】:

或者:在 Management Studio 中生成备份脚本,将其放入存储过程中,从 C# 代码运行过程。

CREATE PROCEDURE sp_backup
AS
BEGIN
    BACKUP DATABASE [YourDatabase] TO  DISK = N'C:\YourPathAndFile.bak' 
    WITH NOFORMAT, NOINIT,  
    NAME = N'Full Database Backup', SKIP, NOREWIND, NOUNLOAD,  STATS = 10
END
GO

【讨论】:

    【解决方案2】:

    SQL 管理对象 - Microsoft.SqlServer.Management.Smo

    它具有完成该操作所需的方法。

    【讨论】:

      【解决方案3】:

      看 using SMO Library from c#

      关于如何使用 C# 中的 SMO 库来执行管理员任务,例如备份和恢复。

      【讨论】:

        【解决方案4】:

        这是一个将数据库备份内容放入流中的脚本(作为“选择”结果),这对于以编程方式不带任何共享文件夹创建备份很有用。您唯一需要的是与服务器的连接。已针对 MSSQL 2008 R2 进行测试。

        -- переменные
        DECLARE @dbName nvarchar(MAX);
        SET @dbName = N'AdventureWorks';
        
        DECLARE @backupFileName nvarchar(MAX);
        SET @backupFileName = N'C:\Temp\' + @dbName + N'.bak';
        --EXECUTE (N'PRINT N''Создание бэкапа '+ @backupFileName + '''')
        -- создание временной папки
        EXEC xp_cmdshell N'mkdir C:\Temp', no_output;
        -- бэкап с перетиранием имеющегося файла
        DECLARE @sqlScript nvarchar(MAX);
        SET @sqlScript = N'BACKUP DATABASE ['
            + @dbName
            + '] TO  DISK = N'''
            + @backupFileName
            + ''' WITH NOFORMAT, INIT, NAME = N'''
            + @dbName
            + '-Full Database Backup'', SKIP, NOREWIND, NOUNLOAD, STATS = 10';
        --SELECT @sqlScript AS backupScript
        EXECUTE (@sqlScript);
        -- похоже, файл в 3ГБ можно вычитать... но памяти на это уходит ОЧЕНЬ МНОГО
        -- вычитывание файла
        SET @sqlScript = N'
        SELECT N''' + @backupFileName + ''' AS [backupFileName], BulkColumn AS [backupContent]
        FROM OPENROWSET (BULK ''' + @backupFileName + ''', SINGLE_BLOB) MyFile';
        --SELECT @sqlScript AS openRowsetScript
        EXECUTE (@sqlScript);
        -- удаление файла
        SET @sqlScript = N'EXEC xp_cmdshell ''del "' + @backupFileName + '"'', no_output';
        EXECUTE (@sqlScript);
        

        结果如下:

            backupFileName  backupContent
        C:\Temp\AdventureWorks.bak  0x54415045000003008C000E01000000000000000000000000000...
        

        【讨论】:

          【解决方案5】:

          如果您拥有正确的权限,应该很容易。

          想到的2种方式,已经提到的SQL管理对象,我找到了一个很好的项目,利用了这些here

          您也可以随时通过 ADO.Net 对象向服务器发送 T-SQL 备份命令。 msdn 参考你需要的主要命令here

          【讨论】:

          • 确保权限不是问题
          【解决方案6】:

          如果您想在 C# 中使用字节流,例如在写入磁盘之前压缩流,欢迎您查看我的项目中的代码,SQL Server Compressed Backup。它有一个用 C++ 编写的小型 VDI(SQL Server 虚拟设备 API)DLL 包装器,忠实地将每个 VDI 选项暴露给 .Net,其余(大部分)代码是用 C# 编写的。

          【讨论】:

            猜你喜欢
            • 2020-05-15
            • 1970-01-01
            • 2018-09-23
            • 1970-01-01
            • 2022-01-23
            • 1970-01-01
            • 1970-01-01
            • 2011-08-12
            • 2020-07-09
            相关资源
            最近更新 更多