以编程方式使用备份数据库

9

我如何在编程中使用.bak数据库备份文件(通过SQL Server中的查询进行备份)?

我希望我的应用程序可以将数据库备份到一个位置(我已经可以做到这一点),并且还希望它能够加载备份的数据库(.bak文件)。

我如何使用C#实现这个功能?

4个回答

16

首先确保你在开发环境中安装了SMO(SQL Server Management Objects)并且可以访问它。如果你在开发环境中安装了某个版本的SQL Server,则通常情况下会有SMO。

如果你已经有SMO库可用,那么你可以使用以下代码片段进行操作:

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

static void Main(string[] args)
{
    // create instance of SMO Server object
    Server myServer = new Server("(local)");

    // create new instance of "Restore" object    
    Restore res = new Restore();
    res.Database = "SMO";  // your database name

    // define options       
    res.Action = RestoreActionType.Database;
    res.Devices.AddDevice(@"C:\SMOTest.bak", DeviceType.File);
    res.PercentCompleteNotification = 10;
    res.ReplaceDatabase = true;

    // define a callback method to show progress
    res.PercentComplete += new PercentCompleteEventHandler(res_PercentComplete);

    // execute the restore    
    res.SqlRestore(myServer);
 }

 // method to show restore progress
 static void res_PercentComplete(object sender, PercentCompleteEventArgs e)
 {
    // do something......
 }
为了使此功能可用,您需要引用以下项目参考: alt text 而命名空间Microsoft.SqlServer.SmoExtended实现在名为Microsoft.SqlServer.SmoExtended.dll的程序集中,如果您安装了SMO,则应该可以在目录C:\Program Files\Microsoft SQL Server\100\SDK\Assemblies\找到它。
如果您没有安装SMO,您可以从这里获取SQL Server 2008版本,或者从这里获取SQL Server 2008 R2版本(还有一个更早的版本适用于SQL Server 2005)。

1
SMO 对于这样一个简单的任务来说并不是必需的。 - driis
3
自从什么时候使用 .bak 文件进行编程变成了一项简单的任务? - Mitch Wheat
1
@driis:是的,如果只是这个任务 - 那么SMO可能有点大材小用。但是OP可能会扩展这个任务。有时候这也只是一个选择 - 我想使用T-SQL语句并执行它们,还是我想使用特定于任务的库来实现某些东西。 - marc_s
1
这是一个很好的答案。但是对我来说,它没有起作用,因为我必须重新定位文件。所以,请确保创建“RelocateFile”文件对象并将它们添加到“Restore.RelocateFiles”容器中。需要重新定位的文件列表可以在restore.ReadBackupHeader(sql_server)中找到。 - Gezim
您还可以使用Nuget软件包管理器安装SMO,请参见:https://www.nuget.org/packages/Microsoft.SqlServer.SqlManagementObjects - Cory Baumer
显示剩余5条评论

5

只需使用SqlCommand.ExecuteNonQuery来执行所需的SQL操作,例如:

BACKUP DATABASE [dbname] ......

RESTORE DATABASE [dbname] ......

当然,所涉及的SQL用户需要具备适当的权限。

1

这是如何备份:

-- =========================================================
-- Author:        Stefan
-- Create date:   16.07.2010
-- Last mutation: 16.07.2010
-- Description:   Backup der ausgewählten Datenbank
-- =========================================================
CREATE PROCEDURE [dbo].[sp_BackupDatabase] 
    @in_strDataBase varchar(50)
    --,@in_strUser varchar(36)

AS
BEGIN

DECLARE @strBasePath  nvarchar(3000)
DECLARE @strFileName  nvarchar(1000)

DECLARE @strFileNameAndPath  nvarchar(4000)

SET @strBasePath = 'E:\Temp\'

SET @strFileName = @in_strDataBase
SET @strFileName = @strFileName + '_'
SET @strFileName = @strFileName + convert(varchar, getdate(), 112)
SET @strFileName = @strFileName + '_' + REPLACE(convert(varchar, getdate(), 108),':','_'); 
SET @strFileName = @strFileName + '_sts' 
SET @strFileName = @strFileName + '.bak'

SET @strFileNameAndPath = @strBasePath + @strFileName

PRINT @strFileNameAndPath

BACKUP DATABASE @in_strDataBase TO DISK=@strFileNameAndPath

END

GO

这是如何恢复的:

RESTORE DATABASE MyDatabase
FROM DISK='C:\temp\MyDatabase_20100810.bak' 
WITH REPLACE,
MOVE 'MyDatabase' TO 'E:\SQLData_2008\MyDatabase.mdf',
MOVE 'MyDatabase_log' TO 'E:\SQLData_2008\MyDatabase.ldf' 


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接