В прошлый раз, когда я работал над проектом, включающим восстановление и восстановление базы данных, я поискал в Интернете и обнаружил, что он был реализован с использованием 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 — constr)
использование системы;
использование System.Configuration;
использование System.Data.SqlClient;
использование System.Data;
пространство имен web.base_class
{
/// <сводка>
/// Класс DbOper, в основном использует SQLDMO для резервного копирования и восстановления базы данных Microsoft SQL Server.
/// </сводка>
публичный класс DbOper
{
частный строковый сервер;
идентификатор частной строки;
частная строка pwd;
частная строковая база данных;
частная строка conn;
/// <сводка>
/// Конструктор класса DbOper
/// </сводка>
публичный DbOper()
{
conn=System.Configuration.ConfigurationSettings.AppSettings["constr"].ToString();
server=cut(conn,"server=",";");
uid=cut(conn,"uid=",";");
pwd=cut(conn,"pwd=",";");
база данных=cut(conn,"database=",";");
}
общедоступная строка вырезана (строка str, строка bg, строка ed)
{
строка суб;
sub=str.Substring(str.IndexOf(bg)+bg.Length);
sub=sub.Substring(0,sub.IndexOf(";"));
возврат сабвуфера;
}
/// <сводка>
/// Резервное копирование базы данных
/// </сводка>
public bool DbBackup (URL-адрес строки)
{
SQLDMO.Backup oBackup = новый SQLDMO.BackupClass();
SQLDMO.SQLServer oSQLServer = новый SQLDMO.SQLServerClass();
пытаться
{
oSQLServer.LoginSecure = ложь;
oSQLServer.Connect(сервер,uid, pwd);
oBackup.Action = SQLDMO.SQLDMO_BACKUP_TYPE.SQLDMOBackup_Database;
oBackup.Database = база данных;
oBackup.Files = url;//"d:Northwind.bak";
oBackup.BackupSetName = база данных;
oBackup.BackupSetDescription = "Резервное копирование базы данных";
oBackup.Initialize = правда;
oBackup.SQLBackup(oSQLServer);
вернуть истину;
}
ловить
{
вернуть ложь;
бросать;
}
окончательно
{
oSQLServer.DisConnect();
}
}
/// <сводка>
/// Восстановление базы данных
/// </сводка>
общедоступная строка DbRestore (URL-адрес строки)
{
if(exepro()!=true)//Выполняем хранимую процедуру
{
вернуть «Операция не удалась»;
}
еще
{
SQLDMO.Restore oRestore = новый SQLDMO.RestoreClass();
SQLDMO.SQLServer oSQLServer = новый SQLDMO.SQLServerClass();
пытаться
{
oSQLServer.LoginSecure = ложь;
oSQLServer.Connect(сервер, uid, pwd);
oRestore.Action = SQLDMO.SQLDMO_RESTORE_TYPE.SQLDMORestore_Database;
oRestore.Database = база данных;
oRestore.Files = url;//@"d:Northwind.bak";
oRestore.FileNumber = 1;
oRestore.ReplaceDatabase = true;
oRestore.SQLRestore(oSQLServer);
вернуть «ок»;
}
поймать (Исключение е)
{
вернуть «Не удалось восстановить базу данных»;
бросать;
}
окончательно
{
oSQLServer.DisConnect();
}
}
}
частный bool exepro()
{
SqlConnection conn1 = new SqlConnection("server="+server+";uid="+uid+";pwd="+pwd+";database=master");
SqlCommand cmd = новый SqlCommand("killspid",conn1);
cmd.ТипКоманды = ТипКоманды.СохраненнаяПроцедура;
cmd.Parameters.Add("@dbname","port");
пытаться
{
conn1.Открыть();
cmd.ExecuteNonQuery();
вернуть истину;
}
поймать (исключение ex)
{
вернуть ложь;
}
окончательно
{
conn1.Закрыть();
}
}
}
}