Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过C#代码恢复SQL Server数据库_C#_Sql Server 2008 - Fatal编程技术网

如何通过C#代码恢复SQL Server数据库

如何通过C#代码恢复SQL Server数据库,c#,sql-server-2008,C#,Sql Server 2008,我尝试按如下方式恢复数据库: SQL = @"RESTORE DATABASE MyDataBase TO DISK='d:\MyDATA.BAK'"; Cmd = new SqlCommand(SQL, Conn); Cmd.ExecuteNonQuery(); Cmd.Dispose(); 但我总是犯错误: Msg 3102,第16级,状态1,第7行 还原无法处理数据库“MyDataBase”,

我尝试按如下方式恢复数据库:

SQL = @"RESTORE DATABASE MyDataBase TO DISK='d:\MyDATA.BAK'";
                Cmd = new SqlCommand(SQL, Conn);
                Cmd.ExecuteNonQuery();
                Cmd.Dispose();
但我总是犯错误:

Msg 3102,第16级,状态1,第7行
还原无法处理数据库“MyDataBase”,因为它正在使用中 到本届会议为止。建议使用主数据库 执行此操作时。
味精3013,第16级,状态1,第7行
还原数据库正在异常终止


必须通过其他数据库连接到数据库服务器


因此,您的连接字符串应该让您说出“Master”或服务器上的另一个数据库,然后您就可以完成手头的任务。

您的连接字符串应该有一个
Master
数据库作为默认目录进行连接

您的数据库连接最有可能连接到您试图恢复的数据库。因此,有一个DB共享锁,它阻止恢复您的DB

试试这个

SQL = @"USE master BACKUP DATABASE MyDataBase TO DISK='d:\MyDATA.BAK'";

或者将连接详细信息更改为使用master DB

我更喜欢使用SMO恢复备份:

Microsoft.SqlServer.Management.Smo.Server smoServer = 
     new Server(new ServerConnection(server));

Database db = smoServer.Databases['MyDataBase'];
string dbPath = Path.Combine(db.PrimaryFilePath, 'MyDataBase.mdf');
string logPath = Path.Combine(db.PrimaryFilePath, 'MyDataBase_Log.ldf');
Restore restore = new Restore();
BackupDeviceItem deviceItem = 
    new BackupDeviceItem('d:\MyDATA.BAK', DeviceType.File);
restore.Devices.Add(deviceItem);
restore.Database = backupDatabaseTo;
restore.FileNumber = restoreFileNumber;
restore.Action = RestoreActionType.Database;
restore.ReplaceDatabase = true;
restore.SqlRestore(smoServer);

db = smoServer.Databases['MyDataBase'];
db.SetOnline();
smoServer.Refresh();
db.Refresh();
您需要对Microsoft.SqlServer.Smo、Microsoft.SqlServer.SmoExtended和Microsoft.SqlServer.Management.Sdk.Sfc的引用
 public void Restore(string Filepath)
        {
            try
            {
                if(con.State == ConnectionState.Closed)
                {
                    con.Open();
                }
                SqlCommand cmd1 = new SqlCommand("ALTER DATABASE [" + Database + "] SET SINGLE_USER WITH ROLLBACK IMMEDIATE ", con);
                cmd1.ExecuteNonQuery();
                SqlCommand cmd2 = new SqlCommand("USE MASTER RESTORE DATABASE [" + Database + "] FROM DISK='" + Filepath + "' WITH REPLACE", con);
                cmd2.ExecuteNonQuery();
                SqlCommand cmd3 = new SqlCommand("ALTER DATABASE [" + Database + "] SET MULTI_USER", con);
                cmd3.ExecuteNonQuery();
                con.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            con.Close();
        }
{
尝试
{
if(con.State==ConnectionState.Closed)
{
con.Open();
}
SqlCommand cmd1=新的SqlCommand(“ALTER DATABASE[“+DATABASE+”]设置具有立即回滚功能的单个用户”,con);
cmd1.ExecuteOnQuery();
SqlCommand cmd2=新的SqlCommand(“使用主还原数据库[“+数据库+”],从磁盘=”“+文件路径+”,替换为“”,con);
cmd2.ExecuteNonQuery();
SqlCommand cmd3=新的SqlCommand(“更改数据库[“+数据库+”]设置多用户”,con);
cmd3.ExecuteNonQuery();
con.Close();
}
捕获(例外情况除外)
{
MessageBox.Show(例如Message);
}
con.Close();
}

我以这个解决方案结束。我的数据库名为Stats这将在没有安装MSSQL management studio的情况下工作

    public void BackUpDB(string fname)
    {
        using (SqlConnection cn = new SqlConnection(_cstr))
        {
            cn.Open();
            string cmd = "BACKUP DATABASE [Stats] TO DISK='" + fname + "'";
            using (var command = new SqlCommand(cmd, cn))
            {
                command.ExecuteNonQuery();
            }
        }
    }

    public void RestoreDB(string fname)
    {
        using (SqlConnection cn = new SqlConnection(_cstr))
        {
            cn.Open();
            #region step 1 SET SINGLE_USER WITH ROLLBACK
            string sql = "IF DB_ID('Stats') IS NOT NULL ALTER DATABASE [Stats] SET SINGLE_USER WITH ROLLBACK IMMEDIATE";
            using (var command = new SqlCommand(sql, cn))
            {
                command.ExecuteNonQuery();
            }
            #endregion
            #region step 2 InstanceDefaultDataPath

            sql = "SELECT ServerProperty(N'InstanceDefaultDataPath') AS default_file";
            string default_file = "NONE";
            using (var command = new SqlCommand(sql, cn))
            {
                using (var reader = command.ExecuteReader())
                {
                   if (reader.Read())
                    {
                        default_file = reader.GetString(reader.GetOrdinal("default_file"));
                    }
                }
            }
            sql = "SELECT ServerProperty(N'InstanceDefaultLogPath') AS default_log";
            string default_log = "NONE";
            using (var command = new SqlCommand(sql, cn))
            {
                using (var reader = command.ExecuteReader())
                {
                    if (reader.Read())
                    {
                        default_log = reader.GetString(reader.GetOrdinal("default_log"));
                    }
                }
            }
            #endregion
            #region step 3 Restore
            sql = "USE MASTER RESTORE DATABASE [Stats] FROM DISK='" + fname + "' WITH  FILE = 1, MOVE N'Stats' TO '" + default_file + "Stats.mdf', MOVE N'Stats_Log' TO '"+ default_log+ "Stats_Log.ldf', NOUNLOAD,  REPLACE,  STATS = 1;";
            using (var command = new SqlCommand(sql, cn))
            {
                command.ExecuteNonQuery();
            }
            #endregion
            #region step 4 SET MULTI_USER
            sql = "ALTER DATABASE [Stats] SET MULTI_USER";
            using (var command = new SqlCommand(sql, cn))
            {
                command.ExecuteNonQuery();
            }
            #endregion
        }
    }

很抱歉我需要还原我尝试了以下操作:从磁盘恢复数据库MyDataBase='d:\MyDataBase.BAK'并出现此错误我尝试了以下操作:使用主还原MyDataBase到磁盘='d:\MyDATA.BAK,但仍然出现此错误:Msg 3159,级别16,状态1,第7行数据库“MyDataBase”的日志尾部尚未备份。如果日志中包含您不想丢失的工作,请将备份日志与NORECOVERY一起使用以备份日志。使用RESTORE语句的WITH REPLACE或WITH STOPAT子句只覆盖日志内容。Msg 3013,级别16,状态1,第7行还原数据库异常终止。在我的计算机上,访问这些库所需的DLL位于C:\Program Files(x86)\Microsoft SQL Server\110\SDK\程序集中(因为我已将SQL Server Management Studio安装为SQL Server Express 2008 R2的一部分),我需要浏览到此文件夹并添加:Microsoft.SqlServer.ConnectionInfo.dll、Microsoft.SqlServer.Management.Sdk.Sfc.dll、Microsoft.SqlServer.Smo.dll、Microsoft.SqlServer.SmoExtended.dll。为什么要使用dbPath和logPath行?它们似乎没有必要。您还可以通过使用restore.Devices.AddDevice(并传递您在new中使用的参数)使其更加简洁BackupDeviceItem@ChrisMoschini我相信他的意思是:RelocateFile relocatedafile=new RelocateFile(restore.ReadFileList(smoServer).Rows[0][0].ToString(),dbPath);restore.RelocateFiles.Add(重新定位的数据文件);