用asp.net还原与恢复sqlserver数据库(转)
生活随笔
收集整理的這篇文章主要介紹了
用asp.net还原与恢复sqlserver数据库(转)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
利用SQLDMO實(shí)現(xiàn)的,只要添加SQLDMO引用就好了,然后利用下邊的類的方法就可以實(shí)現(xiàn)了。
我把原作者的類擴(kuò)充了一下,可以自動(dòng)識(shí)別web.config里?的數(shù)據(jù)庫(kù)連接字符串,可以通過(guò)變量設(shè)置還原恢復(fù)的信息。
需要注意的時(shí)還原,還原的時(shí)候問(wèn)題最大了,有別的用戶使用數(shù)據(jù)庫(kù)的時(shí)候無(wú)法還原,解決辦法就是在MASTER數(shù)據(jù)庫(kù)中添加一個(gè)存儲(chǔ)過(guò)程:
create?proc?killspid?(@dbname?varchar(20))
as
begin
declare?@sql?nvarchar(500)
declare?@spid?int
set?@sql='declare?getspid?cursor?for?
select?spid?from?sysprocesses?where?dbid=db_id('''+@dbname+''')'
exec?(@sql)
open?getspid
fetch?next?from?getspid?into?@spid
while?@@fetch_status<>-1
begin
exec('kill?'+@spid)
fetch?next?from?getspid?into?@spid
end
close?getspid
deallocate?getspid
end
GO
在還原之前先執(zhí)行這個(gè)存儲(chǔ)過(guò)程,需要傳遞dbname,就是你的數(shù)據(jù)庫(kù)的名字。下邊是類的原代碼:(web.config里的數(shù)據(jù)庫(kù)連接字符串是constr)
?
using?System;
using?System.Configuration;
using?System.Data.SqlClient;
using?System.Data;
namespace?web.base_class
{
?????///?<summary>
?????///?DbOper類,主要應(yīng)用SQLDMO實(shí)現(xiàn)對(duì)Microsoft?SQL?Server數(shù)據(jù)庫(kù)的備份和恢復(fù)
?????///?</summary>
?????public?class?DbOper
?????{
??????????private?string?server;
??????????private?string?uid;
??????????private?string?pwd;
??????????private?string?database;
??????????private?string?conn;
?????????///?<summary>
?????????///?DbOper類的構(gòu)造函數(shù)
?????????///?</summary>
?????????public?DbOper()
?????????{
??????????????conn=System.Configuration.ConfigurationSettings.AppSettings["constr"].ToString();
??????????????server=cut(conn,"server=",";");
??????????????uid=cut(conn,"uid=",";");
??????????????pwd=cut(conn,"pwd=",";");
??????????????database=cut(conn,"database=",";");
?????????}
?????????public?string?cut(string?str,string?bg,string?ed)
?????????{
??????????????string?sub;
??????????????sub=str.Substring(str.IndexOf(bg)+bg.Length);
??????????????sub=sub.Substring(0,sub.IndexOf(";"));
??????????????return?sub;
?????????}
?
?????????///?<summary>
?????????///?數(shù)據(jù)庫(kù)備份
?????????///?</summary>
?????????public??bool?DbBackup(string?url)
?????????{
??????????????SQLDMO.Backup?oBackup?=?new?SQLDMO.BackupClass();
??????????????SQLDMO.SQLServer?oSQLServer?=?new?SQLDMO.SQLServerClass();
??????????????try
??????????????{
???????????????????oSQLServer.LoginSecure?=?false;
???????????????????oSQLServer.Connect(server,uid,?pwd);
???????????????????oBackup.Action?=?SQLDMO.SQLDMO_BACKUP_TYPE.SQLDMOBackup_Database;
???????????????????oBackup.Database?=?database;
???????????????????oBackup.Files?=?url;//"d:\Northwind.bak";
???????????????????oBackup.BackupSetName?=?database;
???????????????????oBackup.BackupSetDescription?=?"數(shù)據(jù)庫(kù)備份";
???????????????????oBackup.Initialize?=?true;
???????????????????oBackup.SQLBackup(oSQLServer);
???????????????????return?true;
??????????????}
??????????????catch
??????????????{
???????????????????return?false;
???????????????????throw;
??????????????}
??????????????finally
??????????????{
???????????????????oSQLServer.DisConnect();
??????????????}
?????????}
?
?????????///?<summary>
?????????///?數(shù)據(jù)庫(kù)恢復(fù)
?????????///?</summary>
?????????public?string?DbRestore(string?url)
?????????{
??????????????if(exepro()!=true)//執(zhí)行存儲(chǔ)過(guò)程
??????????????{
???????????????????return?"操作失敗";
??????????????}
??????????????else
??????????????{
???????????????????SQLDMO.Restore?oRestore?=?new?SQLDMO.RestoreClass();
???????????????????SQLDMO.SQLServer?oSQLServer?=?new?SQLDMO.SQLServerClass();
???????????????????try
???????????????????{
????????????????????????oSQLServer.LoginSecure?=?false;
????????????????????????oSQLServer.Connect(server,?uid,?pwd);
????????????????????????oRestore.Action?=?SQLDMO.SQLDMO_RESTORE_TYPE.SQLDMORestore_Database;
????????????????????????oRestore.Database?=?database;
????????????????????????oRestore.Files?=?url;//@"d:\Northwind.bak";
????????????????????????oRestore.FileNumber?=?1;
????????????????????????oRestore.ReplaceDatabase?=?true;
????????????????????????oRestore.SQLRestore(oSQLServer);
???????????????????????return?"ok";
???????????????????}
???????????????????catch(Exception?e)
???????????????????{
???????????????????????return?"恢復(fù)數(shù)據(jù)庫(kù)失敗";
???????????????????????throw;
???????????????????}
???????????????????finally
???????????????????{
????????????????????????oSQLServer.DisConnect();
???????????????????}
??????????????}
?????????}
??????????private?bool?exepro()
?????????{
??????????????SqlConnection?conn1?=?new?SqlConnection("server="+server+";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();
??????????????}
?
?????????}
?????}
}
本文轉(zhuǎn)自高海東博客園博客,原文鏈接:http://www.cnblogs.com/ghd258/archive/2006/02/28/339458.html,如需轉(zhuǎn)載請(qǐng)自行聯(lián)系原作者
總結(jié)
以上是生活随笔為你收集整理的用asp.net还原与恢复sqlserver数据库(转)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 《JavaScript高级程序设计》阅读
- 下一篇: 试用 Vista RC1 ,正式版离我们