如何在不使用.mdf或.ldf文件的情况下将.bak文件还原到新服务器,以编程方式使用C#?

时间:2017-06-23 20:05:43

标签: c# .net sql-server backup

开始使用的一些信息:

  1. 我正在使用SQL Server Express 2014
  2. 我正在使用C#
  3. 我无法使用SMO功能完成以下任务
  4. 我正在尝试将从计算机A获取的.bak文件还原到计算机B. 我想使用C#以编程方式执行此操作,但不使用SMO函数。

    在SSMS(SQL Server Management Studio)中,我可以使用.bak文件手动还原数据库。我希望能够用C#运行程序。

    只要我拥有.mdf和.ldf文件,我就可以恢复.bak文件,但不能没有它们。在SSMS中手动执行此操作似乎有效,因此我认为必须有一种方法可以使用C#执行此操作。这就是我所拥有的:

    DBConnection connect1 = new DBConnection();
    connect1.connectionString = "Data Source=" + textBox1.Text + "; Integrated Security=SSPI"; // textbox1 contains a user entered server name.
    
    // Create a new database.
    using (SqlConnection myConnection = new SqlConnection(connect1.connectionString))// set the connection to sql.
    {
        SqlCommand createDB = new SqlCommand("Create Database [" + dbName + "]", myConnection);
        createDB.Connection.Open();
        createDB.ExecuteNonQuery();
    }
    
    // Restore the data from the backup into the new database.
    connect1 = new DBConnection();
    connect1.connectionString = "Data Source=" + textBox1.Text + "; Initial Catalog=Master; Integrated Security=SSPI";
    using (SqlConnection myConnection = new SqlConnection(connect1.connectionString))// set the connection to sql.
    {
        //SqlCommand createDB = new SqlCommand("Restore Database [" + dbName + "] FROM DISK = " + bakDirctory + " "
        //    + "WITH MOVE '" + oldDBName + "' TO '" + mdfDirectory + "', "
        //    + "MOVE '" + oldDBName + "_log' TO '" + ldfDirectory + "', "
        //    + "REPLACE", myConnection);
        // oldDBName contains what the name of the database was when the .bak file was created.
    
        SqlCommand createDB = new SqlCommand("Restore Database [" + dbName + "] FROM DISK = " + bakDirectory, myConnection);
        createDB.Connection.Open();
        createDB.ExecuteNonQuery();
    }
    

    代码段的注释部分有效,但需要使用.mdf和.ldf文件。下面的部分仅使用.bak文件,但在尝试运行该代码时出现未处理的异常:

    备份集包含除现有' dbname'之外的数据库的备份。数据库

    我认为这是因为新创建的数据库的数据库结构与.bak文件中的数据库结构不匹配。 (如果我有错误,请纠正我)。有没有办法让我只使用.bak文件恢复备份?提前感谢你花时间看这个。

1 个答案:

答案 0 :(得分:2)

正如@DanGuzman所说,没有必要事先创建一个新的数据库。

按照(@ScottChamberlain)评论中的说明,我能够找到恢复数据库所需的脚本,而不使用.mdf或.ldf文件。确切的脚本是:

SqlCommand createDB = new SqlCommand("RESTORE DATABASE [" + dbName + "] FROM  DISK = N'" + bakDirectory + "' " +
"WITH  FILE = 2,  MOVE N'" + oldDBName + "' TO N'C:\\Program Files\\Microsoft SQL Server\\MSSQL12.ANTSQLSERVER\\MSSQL\\DATA\\" + dbName + ".mdf',  " +
"MOVE N'" + oldDBName + "_log' TO N'C:\\Program Files\\Microsoft SQL Server\\MSSQL12.ANTSQLSERVER\\MSSQL\\DATA\\" + dbName + "_log.ldf',  NOUNLOAD,  STATS = 5", myConnection);

(C:\ Program Files \ Microsoft SQL Server \ MSSQL12.ANTSQLSERVER \ MSSQL \ DATA \)路径是创建.mdf和.ldf文件的默认位置。