C# 以编程方式获取sql server的默认备份路径
我正在使用c以编程方式备份某些sql server数据库。我认为Microsoft.SqlServer.Management.Smo和其他一些库就是为此而设计的。现在我可以备份数据库了。很不错的。代码如下:C# 以编程方式获取sql server的默认备份路径,c#,sql-server,backup,C#,Sql Server,Backup,我正在使用c以编程方式备份某些sql server数据库。我认为Microsoft.SqlServer.Management.Smo和其他一些库就是为此而设计的。现在我可以备份数据库了。很不错的。代码如下: var server = new Server(@"" + InstanceName); var backuper = new Backup(); try { backuper.Action = BackupActionType.Database; backuper.Data
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);
然后我可以知道它在哪里,但我想做的是将它备份到它的默认位置并获取它的路径。请帮我解决这个问题。从这篇博文中,您可以使用以下功能:
我通常在backuper.SqlBackupserver之后立即执行下面的存储过程; 返回最近的备份目标路径。我之所以使用这种方法,是因为使用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
可在此处找到此副本的正确答案:
鉴于您已经在使用SMO对象,这应该是最简单的答案 如何从c中调用它?它需要是一个独立的db调用,而不是上面的SMO代码;您可以像调用任何sql select语句一样调用它:选择dbo.fn_SQLServerBackupDir作为backuppath,然后读取结果。谢谢,它工作得很好:我现在唯一关心的是,一些希望创建数据库备份的最终用户应该在多个数据库上使用此软件,如果他们连接到数据库的用户没有创建函数所需的特权,该怎么办?您不一定需要该函数,但是他们需要权限来执行master.dbo.xp_instance_regread,您可以尝试以另一种方式调用它。如果无法授予他们该权限,则不确定是否有解决方法。备份完成后,您可以找到与数据库关联的最新备份集,并从中解决该问题?
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
Server.BackupDirectory;