zoukankan
html css js c++ java
用asp.net还原与恢复sqlserver数据库(转)
利用SQLDMO实现的,只要添加SQLDMO引用就好了,然后利用下边的类的方法就可以实现了。
我把原作者的类扩充了一下,可以自动识别web.config里 的数据库连接字符串,可以通过变量设置还原恢复的信息。
需要注意的时还原,还原的时候问题最大了,有别的用户使用数据库的时候无法还原,解决办法就是在MASTER数据库中添加一个存储过程:
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
在还原之前先执行这个存储过程,需要传递dbname,就是你的数据库的名字。下边是类的原代码:(web.config里的数据库连接字符串是constr)
using
System;
using
System.Configuration;
using
System.Data.SqlClient;
using
System.Data;
namespace
web.base_class
{
/**/
///
<summary>
///
DbOper类,主要应用SQLDMO实现对Microsoft SQL Server数据库的备份和恢复
///
</summary>
public
class
DbOper
{
private
string
server;
private
string
uid;
private
string
pwd;
private
string
database;
private
string
conn;
/**/
///
<summary>
///
DbOper类的构造函数
///
</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>
///
数据库备份
///
</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
=
"
数据库备份
"
;
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
=
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
"
恢复数据库失败
"
;
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();
}
}
}
}
查看全文
相关阅读:
ctags的基本操作总结
iOS开发使用Unwind Segue进行返回
Swoole源代码学习记录(十二)——ReactorThread模块
HDU 2189 ( 悼念512汶川大地震遇难同胞——来生一起走 )
WEB开发面试题
UVA 11762
shell EOF注意点
Oracle EBS 从Web界面进入责任时,提示不存在可用的有效责任
LeetCode--Reverse Integer
atitit.web 推送实现方案集合
原文地址:https://www.cnblogs.com/ghd258/p/339458.html
最新文章
异常的分类图解
Java集合学习总结
currval of sequence "follow_id_seq" is not yet defined in this session
postgresql 异步流复制hot standby搭建
Golang 环境配置建议(Atom)
pyspider的一个诡异问题
Django升级1.8的一些问题
Android面试题摘录
推荐 git community book 中文版
Django的时区问题
热门文章
.gitignore文件不起作用的解决方法
Nginx接收的host值会影响alias的规则匹配
vue 判断是否登录,未登录跳转到登录页
JavaScript常用八种继承方案
前端项目技术选型
如何禁止浏览器自动填充
Nuxt.js 基础入门教程
从 JavaScript 到 TypeScript
javascript oo实现
WebSocket 详解
Copyright © 2011-2022 走看看