如何使用c#使用新数据库名称还原Sqlserver .bak文件

时间:2015-07-21 08:55:31

标签: c# sql-server-2008-r2 database-restore

我尝试创建数据库备份并恢复到另一个数据库,备份正在运行但是恢复失败,因为我创建备份时创建数据库名称也就像,   USe Master  创建数据库[Samplename]  然后生成所有表格数据  因此,当我尝试使用c#进行恢复时,它会尝试创建新数据库为 Samplename 而不是我的新SampleDB,然后它会给出异常

The file 'C:\Program Files (x86)\Microsoft SQL    
  Server\MSSQL11.BIZSQL\MSSQL\DATA\Product Company.mdf' cannot be
 overwritten.  It is being used by database 'Sample Product Company'.
  File 'Sample Product Company' cannot be restored to 'C:\Program Files
 (x86)\Microsoft SQL Server\MSSQL11.BIZSQL\MSSQL\DATA\Sample Product
 Company.mdf'. Use WITH MOVE to identify a valid location for the file.

 The file 'C:\Program Files (x86)\Microsoft SQL
 Server\MSSQL11.BIZSQL\MSSQL\DATA\Sample Product Company_log.ldf' cannot be overwritten. 
 It is being used by database 'Sample Product Company'.

 File 'Sample Product Company_log' cannot be restored to 'C:\Program Files 
(x86)\Microsoft SQL Server\MSSQL11.BIZSQL\MSSQL\DATA\Sample Product 
Company_log.ldf'. Use WITH MOVE to identify a valid location for the file.

 Problems were identified while planning for the RESTORE statement. Previous      
 messages provide details.

  RESTORE DATABASE is terminating abnormally.

您能否指导我如何使用SQlser2012R2中的新数据库恢复数据库

还原示例代码:

       using (SqlConnection con = new SqlConnection(ConnectionString))
             {
                 con.Open();

                 string UseMaster = "USE master";
                 SqlCommand UseMasterCommand = new SqlCommand(UseMaster, con);
                 UseMasterCommand.ExecuteNonQuery();
                 int iReturn = 0;

                 // If the database does not exist then create it.
                 string strCommand = string.Format("SET NOCOUNT OFF; SELECT COUNT(*) FROM master.dbo.sysdatabases where name=\'{0}\'", DatabaseName);
                 using (SqlCommand sqlCmd = new SqlCommand(strCommand, con))
                 {
                     iReturn = Convert.ToInt32(sqlCmd.ExecuteScalar());
                 }
                 if (iReturn == 0)
                 {
                     SqlCommand command = con.CreateCommand();
                     command.CommandText = "CREATE DATABASE " + DatabaseName;
                     command.ExecuteNonQuery();
                 }
                 ServerConnection serverConnection = new ServerConnection(con);
                 Microsoft.SqlServer.Management.Smo.Server srv = new Microsoft.SqlServer.Management.Smo.Server(serverConnection);
                 string Alter1 = @"ALTER DATABASE [" + DatabaseName + "] SET Single_User WITH Rollback Immediate";
                 SqlCommand Alter1Cmd = new SqlCommand(Alter1, con);
                 Alter1Cmd.ExecuteNonQuery();
                string Restore = @"RESTORE Database [" + DatabaseName + "] FROM DISK = N'" + fileName + @"' WITH  FILE = 1,  NOUNLOAD,  REPLACE,  STATS = 10";
                 SqlCommand RestoreCmd = new SqlCommand(Restore, con);
                 RestoreCmd.ExecuteNonQuery();
                 string Alter2 = @"ALTER DATABASE [" + DatabaseName + "] SET Multi_User";
                 SqlCommand Alter2Cmd = new SqlCommand(Alter2, con);
                 Alter2Cmd.ExecuteNonQuery();




             }

2 个答案:

答案 0 :(得分:0)

以下代码的略微修改版本正在形成我。

            string connectionString = ConfigurationManager.ConnectionStrings["TESTConnectionString"].ConnectionString;
            using (SqlConnection con = new SqlConnection(connectionString))
            {
                con.Open();

                string DatabaseName = "TEST";
                string fileName = "TEST.bak";

                string UseMaster = "USE master";
                SqlCommand UseMasterCommand = new SqlCommand(UseMaster, con);
                UseMasterCommand.ExecuteNonQuery();
                int iReturn = 0;

                // If the database does not exist then create it.
                string strCommand = string.Format("SET NOCOUNT OFF; SELECT COUNT(*) FROM master.dbo.sysdatabases where name=\'{0}\'", DatabaseName);
                using (SqlCommand sqlCmd = new SqlCommand(strCommand, con))
                {
                    iReturn = Convert.ToInt32(sqlCmd.ExecuteScalar());
                }
                if (iReturn == 0)
                {
                    SqlCommand command = con.CreateCommand();
                    command.CommandText = "CREATE DATABASE " + DatabaseName;
                    command.ExecuteNonQuery();
                }
                ServerConnection serverConnection = new ServerConnection(con);
                Microsoft.SqlServer.Management.Smo.Server srv = new Microsoft.SqlServer.Management.Smo.Server(serverConnection);
                string Alter1 = @"ALTER DATABASE [" + DatabaseName + "] SET Single_User WITH Rollback Immediate";
                SqlCommand Alter1Cmd = new SqlCommand(Alter1, con);
                Alter1Cmd.ExecuteNonQuery();
                string Restore = @"RESTORE Database [" + DatabaseName + "] FROM DISK = N'" + fileName + @"' WITH  FILE = 1,  NOUNLOAD,  REPLACE,  STATS = 10";
                SqlCommand RestoreCmd = new SqlCommand(Restore, con);
                RestoreCmd.ExecuteNonQuery();
                string Alter2 = @"ALTER DATABASE [" + DatabaseName + "] SET Multi_User";
                SqlCommand Alter2Cmd = new SqlCommand(Alter2, con);
                Alter2Cmd.ExecuteNonQuery();
            }

答案 1 :(得分:0)

我在Asp.net应用程序中使用过这个解决方案。我的备份&还原目标已修复。刚刚使用File Browse控件获取备份文件名。使用前此解决方案只需添加一些 dll 。您可以从设置SQL Server的路径中获取这些dll。我的SQL Server位于 D:\ Program Files(x86)\ Microsoft SQL Server。 所以我从 D:\ Program Files获取了dll (x86)\ Microsoft SQL Server \ 110 \ SDK \ Assemblies。

只需将以下 dll 文件包含在项目解决方案参考中即可。

我的SQL Server是2008 R2和2012 R2。在这两种情况下,此解决方案都可以正常工作。

using Microsoft.SqlServer.Management;
using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management.Smo.Agent;
using Microsoft.SqlServer.Management.Smo.Broker;
using Microsoft.SqlServer.Management.Smo.Mail;
using Microsoft.SqlServer.Management.Smo.RegisteredServers;
using Microsoft.SqlServer.Management.Sdk.Sfc;
using Microsoft.SqlServer.Management.Common;



protected void btnDatabaseRestore_Click(object sender, EventArgs e)
            {
                try
                {

                    string fileName = fileBrowsingForBackup.FileName; // Browse The Backup File From Device                

                    string restorePath = string.Empty, userName = string.Empty, password = string.Empty, serverName = string.Empty, databaseName = string.Empty;
                    string backFileName = string.Empty, dataFilePath = string.Empty, logFilePath = string.Empty;

                    databaseName = "innboard20151215020030";// For Example Restore File Name innboard20151215020030.bak

                    restorePath = Server.MapPath(@"~/DatabaseBackup/"); // I used the folder for Restore The Database

                    dataFilePath = restorePath;
                    logFilePath = restorePath;
                    restorePath += databaseName + ".bak"; // Get the Backup File Path

                    databaseName = "innboard20151215020031"; // I want to Restore The Database name as "innboard20151215020031"

//Get The Database Server Name, UserId, Passsword

                    string encryptedConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["InnboardConnectionString"].ConnectionString;
                    string decryptedConnectionString = Cryptography.Decrypt(encryptedConnectionString);

                    string[] wordConnectionString = decryptedConnectionString.Split(';');

                    string mInitialCatalog = wordConnectionString[0];
                    string mDataSource = wordConnectionString[1];
                    string mUserId = wordConnectionString[2];
                    string mPassword = wordConnectionString[3];

                    string mInitialCatalogValue = mInitialCatalog.Split('=')[1];
                    string mDataSourceValue = mDataSource.Split('=')[1];
                    string mUserIdValue = mUserId.Split('=')[1];
                    string mPasswordValue = mPassword.Split('=')[1];

                    userName = mUserIdValue;
                    password = mPasswordValue;
                    serverName = mDataSourceValue;

                    // Call The Database Restore Method
                    RestoreDatabase(databaseName, restorePath, serverName, userName, password, dataFilePath, logFilePath);

                    CommonHelper.AlertInfo(innboardMessage, "Restore Database Succeed.", "success");
                }
                catch (Exception ex)
                {
                    CommonHelper.AlertInfo(innboardMessage, ex.InnerException.ToString(), "error");
                }
            }

// Database Restore Method

    public void RestoreDatabase(String databaseName, String filePath, String serverName, String userName, String password, String dataFilePath, String logFilePath)
            {
                try
                {
//Action Type
                    Restore sqlRestore = new Restore();

                    BackupDeviceItem deviceItem = new BackupDeviceItem(filePath, DeviceType.File);
                    sqlRestore.Devices.Add(deviceItem);
                    sqlRestore.Database = databaseName;

                    ServerConnection connection = new ServerConnection(serverName, userName, password);
                    Server sqlServer = new Server(connection);

                    Database db = sqlServer.Databases[databaseName];
                    sqlRestore.Action = RestoreActionType.Database;

//Create The Restore Database Ldf & Mdf file name
                    String dataFileLocation = dataFilePath + databaseName + ".mdf";
                    String logFileLocation = logFilePath + databaseName + "_Log.ldf";
                    db = sqlServer.Databases[databaseName];
                    RelocateFile rf = new RelocateFile(databaseName, dataFileLocation);

// Replace ldf, mdf file name of selected Backup file (in that case innboard20151215020030.bak)
                    System.Data.DataTable logicalRestoreFiles = sqlRestore.ReadFileList(sqlServer);
                    sqlRestore.RelocateFiles.Add(new RelocateFile(logicalRestoreFiles.Rows[0][0].ToString(), dataFileLocation));
                    sqlRestore.RelocateFiles.Add(new RelocateFile(logicalRestoreFiles.Rows[1][0].ToString(), logFileLocation));

                    sqlRestore.ReplaceDatabase = true;

                    sqlRestore.SqlRestore(sqlServer);
                    db = sqlServer.Databases[databaseName];
                    db.SetOnline();
                    sqlServer.Refresh();
                }
                catch (Exception ex)
                {
                    throw;
                }
            }