В прошлый раз, когда я работал над проектом, включающим восстановление и восстановление базы данных, я поискал в Интернете и обнаружил, что он был реализован с использованием SQLDMO. Вам просто нужно добавить ссылку SQLDMO, а затем использовать для этого методы следующих классов.
Я расширил исходный авторский класс, чтобы он мог автоматически распознавать строку подключения к базе данных в web.config и восстанавливать восстановленную информацию с помощью переменных настроек.
При восстановлении нужно быть внимательным. Самая большая проблема возникает при восстановлении. Когда другие пользователи используют базу данных, они не могут восстановить. Решение состоит в том, чтобы добавить хранимую процедуру в базу данных MASTER:
создать proc killspid (@dbname varchar(20))
как
начинать
объявить @sql nvarchar(500)
объявить @spid int
установить @sql='объявить курсор getpid для
выберите spid из системных процессов, где dbid=db_id( '''+@dbname+''')'
исполнитель(@sql)
открыть getpid
получить следующее из getpid в @spid
в то время как @@fetch_status<>-1
начинать
exec('kill '+@spid )
получить следующее из getpid в @spid
конец
закрыть getpid
освобождение getpid
конец
ИДТИ
Чтобы выполнить эту хранимую процедуру перед восстановлением, вам необходимо передать имя базы данных, которое является именем вашей базы данных. Ниже приведен исходный код класса: (строка подключения к базе данных в web.config — const)
using System;
using System.Configuration;
using
System.Data;
пространство имен web.base_class
{
/// <summary>
/// Класс DbOper, в основном использует SQLDMO для реализации резервного копирования и восстановления базы данных Microsoft SQL Server
/// </summary>
public class DbOper
{
Private String uid
;
Private
String Database
;
string conn ;
/// <summary>
/// Конструктор класса DbOper
/// </summary>
public DbOper()
{
conn
=System.Configuration.ConfigurationSettings.AppSettings["constr"].ToString();
( conn,"server=",";");
uid=cut(conn,"uid=",";");
uid=
cut(conn,"pwd=",";");
, "database=",";");
}
public stringcut(string str,string bg,string ed)
{
string
sub=str.Substring(str.IndexOf(bg)+bg.Length)
; . Substring(0,sub.IndexOf(";"));
return sub
}
/// <summary>
/// Резервное копирование базы данных
/// </summary>
public bool DbBackup(string url)
{
SQLDMO.Backup oBackup = new SQLDMO.BackupClass();
SQLDMO.SQLServer oSQLServer = new SQLDMO.SQLServerClass();
попробуйте
{
oSQLServer.LoginSecure = false;
oSQLServer.Connect(server,uid, pwd);
oBackup.Action = SQLDMO.SQLDMO_BACKUP_TYPE.SQLDMOBackup_Database;
oBackup.Database = база данных;
oBackup.Files = URL;//"d:Northwind.bak ";
oBackup.BackupSetName = база данных;
oBackup.BackupSetDescription = "Резервное копирование базы данных";
oBackup.Initialize = true;
oBackup.SQLBackup(oSQLServer);
return true;
}
catch
{
return false;
throw;
}
finally
{
oSQLServer.DisConnect();
}
}
/// <summary>
/// Восстановление базы данных
/// </summary>
public string DbRestore(string url)
{
if(exepro()!=true)//Выполнить хранимую процедуру
{
return "Операция не удалась" }
else
{
;
SQLDMO.Restore oRestore = новый SQLDMO.RestoreClass();
oSQLServer = новый SQLDMO.SQLServerClass();
попробуйте
{
oSQLServer.LoginSecure = false;
oSQLServer.Connect(server, uid, pwd);
oRestore.Action = SQLDMO.SQLDMO_RESTORE_TYPE; .SQLDMORestore_Database;
oRestore.Database = data;
oRestore.Files = url;//@"d:Northwind.bak";
oRestore.FileNumber
= 1
;
oRestore.SQLRestore(oSQLServer);
;
}
catch(Exception e)
{
return«
Не
удалось восстановить базу данных»
;
throw
;
наконец
{
oSQLServer.DisConnect
(
)
;
uid = "+uid+";pwd="+pwd+";database=master");
SqlCommand cmd = new SqlCommand("killspid",conn1);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@dbname) ","port");
try
{
conn1.Open();
cmd.ExecuteNonQuery();
return true;
}
catch(Exception ex)
{
return false;
}
finally
{
conn1.Close();
}
}
}
}