5

C# を使用してプログラムで特定の SQL サーバー データベースのバックアップを作成しています。Microsoft.SqlServer.Management.Smo およびその他のライブラリがこの目的のために作成されていると考えました。これで、データベースをバックアップできます。非常に素晴らしい。コードは次のとおりです。

var server = new Server(@"" + InstanceName);
var backuper = new Backup();
try
{
    backuper.Action = BackupActionType.Database;
    backuper.Database = DbName;
    backuper.Devices.AddDevice(DbName + ".bak", DeviceType.File);
    backuper.BackupSetName = DbName + " - Yedek";
    backuper.BackupSetDescription = "Açık Bulut Depo - " + DbName + " - Yedek";
    backuper.ExpirationDate = DateTime.Now.AddYears(20);
    server.ConnectionContext.Connect();
    backuper.SqlBackup(server); 
}
catch(Exception ex){//..}

ここでの私の質問は、データベースがバックアップされたデバイスのパスを取得するにはどうすればよいですか? 私は自分のパスを次のように指定できることを知っています:

backuper.Devices.AddDevice("C:\SOMEPATH\" + DbName + ".bak", DeviceType.File);

その後、実際にどこにあるかを知ることができますが、やりたいことは、デフォルトの場所にバックアップしてパスを取得することです。これで私を助けてください。

4

3 に答える 3

8

この重複に対する正解は、https ://stackoverflow.com/a/8791588/331889 にあります。

Server.BackupDirectory;

すでに SMO オブジェクトを使用していることを考えると、これが最も簡単な答えになるはずです。

于 2014-05-07T22:59:10.577 に答える
6

このブログ投稿から、以下の関数を使用できます。

http://www.mssqltips.com/sqlservertip/1966/function-to-return-default-sql-server-backup-folder/

CREATE FUNCTION dbo.fn_SQLServerBackupDir() 
RETURNS NVARCHAR(4000) 
 AS 
BEGIN 

 DECLARE @path NVARCHAR(4000) 

EXEC master.dbo.xp_instance_regread 
        N'HKEY_LOCAL_MACHINE', 
        N'Software\Microsoft\MSSQLServer\MSSQLServer',N'BackupDirectory', 
        @path OUTPUT,  
        'no_output' 
RETURN @path 
END;
于 2013-07-11T11:35:21.563 に答える
0

backuper.SqlBackup(server); 私は通常、最新のバックアップ先パスを返すために、直後に以下のストアド プロシージャを実行します。私がこのアプローチを使用するのは、SMO を使用することで、アプリケーション ユーザーが任意の場所/ドライブ、さらには USB ディスクにバックアップできる柔軟性を提供するためです。そのため、ユーザーはデフォルトのバックアップ場所にバックアップしないことを決定し、バックアッププロセスが正常に完了した後にその場所に戻したいと考えています。

  USE [YouDatabaseNameHere]
    GO

    SET ANSI_NULLS ON
    GO

    SET QUOTED_IDENTIFIER ON
    GO

    -- =============================================
    -- Author:      SQL.NET Warrior
    -- =============================================
    CREATE PROCEDURE [dbo].[GetBackupHistory]
    AS
    BEGIN
        SET NOCOUNT ON;
        DECLARE @SQLVer SQL_VARIANT
            ,@DBName VARCHAR(128)
            ,@NumDays   SMALLINT
            ,@SQL       VARCHAR(1024)
            ,@WhereClause   VARCHAR(256)

    SET @DBName = Null
    ;
    SET @NumDays = 14
    ;
    SET @SQLVer = CONVERT(INTEGER, PARSENAME(CONVERT(VARCHAR(20),SERVERPROPERTY('ProductVersion')),4));

    SET @WhereClause = 'WHERE a.type IN (''D'',''I'')
            And a.backup_start_date > GETDATE()- ' + CAST(@NumDays AS VARCHAR)+''
    IF @DBName IS NOT NULL
    BEGIN
        SET @WhereClause = @WhereClause + '
            AND a.database_name = '''+ @DBName +''''
    END

    SET @SQL = '
    SELECT TOP 1 a.database_name,a.backup_start_date
            ,b.physical_device_name AS BackupPath
            ,a.position
            ,a.type
            ,a.backup_size/1024/1024 AS BackupSizeMB
            ,' + CASE 
                WHEN @SQLVer < 10 
                    THEN '0'
                    ELSE 'a.compressed_backup_size/1024/1024'
                END + ' AS CompressedBackMB
        FROM msdb.dbo.backupset a
            INNER JOIN msdb.dbo.backupmediafamily b
                ON a.media_set_id = b.media_set_id
        ' + @WhereClause + '
        ORDER BY a.backup_start_date DESC;';
         --PRINT @SQL
     EXECUTE (@SQL);
    END;



    GO
于 2013-07-11T11:58:59.030 に答える