如何在C#中以编程方式备份​​Sql数据库

29 .net database backup sql-server-2008 c#-4.0

我想编写一个代码来使用C#在.Net 4 FrameWork中备份我的Sql Server 2008数据库.任何人都可以帮忙.

Dav*_*ras 26

您可以使用SqlConnection和SqlCommand连接到数据库并执行以下命令文本,例如:

BACKUP DATABASE [MyDatabase] TO  DISK = 'C:\....\MyDatabase.bak'
Run Code Online (Sandbox Code Playgroud)

请看这里的例子.


Sta*_*ked 21

使用这样的配置文件是一个好习惯:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <connectionStrings>
    <add name="MyConnString" connectionString="Data Source=(local);Initial Catalog=MyDB; Integrated Security=SSPI" ;Timeout=30"/>
  </connectionStrings>
  <appSettings>
    <add key="BackupFolder" value="C:/temp/"/>
  </appSettings>
</configuration> 
Run Code Online (Sandbox Code Playgroud)

您的C#代码将是这样的:

// read connectionstring from config file
var connectionString = ConfigurationManager.ConnectionStrings["MyConnString"].ConnectionString; 

// read backup folder from config file ("C:/temp/")
var backupFolder = ConfigurationManager.AppSettings["BackupFolder"];

var sqlConStrBuilder = new SqlConnectionStringBuilder(connectionString);

// set backupfilename (you will get something like: "C:/temp/MyDatabase-2013-12-07.bak")
var backupFileName = String.Format("{0}{1}-{2}.bak", 
    backupFolder, sqlConStrBuilder.InitialCatalog, 
    DateTime.Now.ToString("yyyy-MM-dd"));

using (var connection = new SqlConnection(sqlConStrBuilder.ConnectionString))
{
    var query = String.Format("BACKUP DATABASE {0} TO DISK='{1}'", 
        sqlConStrBuilder.InitialCatalog, backupFileName);

    using (var command = new SqlCommand(query, connection))
    {
        connection.Open();
        command.ExecuteNonQuery();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @Eric Wu-配置文件中的连接字符串可以指向任何SQL Server,而不必位于同一台计算机上。 (2认同)

小智 18

适合我:

public class BackupService
{
    private readonly string _connectionString;
    private readonly string _backupFolderFullPath;
    private readonly string[] _systemDatabaseNames = { "master", "tempdb", "model", "msdb" };

    public BackupService(string connectionString, string backupFolderFullPath)
    {
        _connectionString = connectionString;
        _backupFolderFullPath = backupFolderFullPath;
    }

    public void BackupAllUserDatabases()
    {
        foreach (string databaseName in GetAllUserDatabases())
        {
            BackupDatabase(databaseName);
        }
    }

    public void BackupDatabase(string databaseName)
    {
        string filePath = BuildBackupPathWithFilename(databaseName);

        using (var connection = new SqlConnection(_connectionString))
        {
            var query = String.Format("BACKUP DATABASE [{0}] TO DISK='{1}'", databaseName, filePath);

            using (var command = new SqlCommand(query, connection))
            {
                connection.Open();
                command.ExecuteNonQuery();
            }
        }
    }

    private IEnumerable<string> GetAllUserDatabases()
    {
        var databases = new List<String>();

        DataTable databasesTable;

        using (var connection = new SqlConnection(_connectionString))
        {
            connection.Open();

            databasesTable = connection.GetSchema("Databases");

            connection.Close();
        }

        foreach (DataRow row in databasesTable.Rows)
        {
            string databaseName = row["database_name"].ToString();

            if (_systemDatabaseNames.Contains(databaseName))
                continue;

            databases.Add(databaseName);
        }

        return databases;
    }

    private string BuildBackupPathWithFilename(string databaseName)
    {
        string filename = string.Format("{0}-{1}.bak", databaseName, DateTime.Now.ToString("yyyy-MM-dd"));

        return Path.Combine(_backupFolderFullPath, filename);
    }
}
Run Code Online (Sandbox Code Playgroud)


Kis*_*mar 10

以下链接已经解释了有关如何使用c#备份sql server 2008数据库的完整详细信息

可以使用多种方式完成Sql Database备份.您可以像在其他答案中一样使用Sql命令,也可以创建自己的类来备份数据.

但这些是不同的备份模式.

  1. 完整数据库备份
  2. 差异数据库备份
  3. 事务日志备份
  4. 使用压缩备份

但这种方法的缺点是它需要在您的客户端系统上安装sql management studio.

  • SMO意味着SQL管理对象本地安装在.NET备份程序执行的机器上,而纯SQL解决方案则不然. (4认同)
  • 在某些时候,我需要使用 SMO,我只是放弃了,所有 sql 文件夹中的 DLL 文件(您可能会在不同文件夹中发现相同 DLL 的不同版本)都无法匹配,甚至 NuGet 版本也不提供匹配的版本DLL 文件 (2认同)

小智 5

            SqlConnection con = new SqlConnection();
            SqlCommand sqlcmd = new SqlCommand();
            SqlDataAdapter da = new SqlDataAdapter();
            DataTable dt = new DataTable();

            con.ConnectionString = ConfigurationManager.ConnectionStrings["MyConString"].ConnectionString;
            string backupDIR = "~/BackupDB";
            string path = Server.MapPath(backupDIR);

            try
            {
                var databaseName = "MyFirstDatabase";
                con.Open();
                string saveFileName = "HiteshBackup";
                sqlcmd = new SqlCommand("backup database" +databaseName.BKSDatabaseName + "to disk='" + path + "\\" + saveFileName + ".Bak'", con);
                sqlcmd.ExecuteNonQuery();
                con.Close();                 


                ViewBag.Success = "Backup database successfully";
                return View("Create");
            }
            catch (Exception ex)
            {
                ViewBag.Error = "Error Occured During DB backup process !<br>" + ex.ToString();
                return View("Create");
            }
Run Code Online (Sandbox Code Playgroud)