代码之家  ›  专栏  ›  技术社区  ›  Andrew Harry

通过C备份SQL Server#

  •  5
  • Andrew Harry  · 技术社区  · 17 年前

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

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

    6 回复  |  直到 13 年前
        1
  •  4
  •   cdonner    17 年前

    或者:在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
  •  3
  •   bioskope    17 年前

    SQL管理对象-microsoft.sqlserver.management.smo

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

        3
  •  3
  •   Abdullah BaMusa    17 年前

    using SMO Library from c#

    关于如何使用c中的smo库执行备份和恢复等管理员任务。

        4
  •  3
  •   Nikita Sinelnikoff    14 年前

    下面是一个脚本,用于将数据库备份内容放入流中(作为“选择”结果),该脚本可用于创建备份程序 没有 任何共享文件夹。您只需要连接到服务器。为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
  •   keith    17 年前

    如果你有适当的权限,应该很容易。

    我想到了两种方法,前面已经提到了sql管理对象,我发现了一个很好的项目,它利用了这些 here

    也可以通过ADO.NET对象向服务器发送T-SQL备份命令。对您需要的主命令的msdn引用 here

        6
  •  2
  •   Clay Lenhart    16 年前

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