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();
}
}
}
}
查看全文
相关阅读:
短信平台接口调用方法参考
C#部分类与部分方法
Oracle表字段类型更改的一个经验
ueditor的上传文件漏洞(c#)
判断一个文件是否是指定后缀名的文件
利用FluorineFx的ByteArray上传图片
FluorineFx 播放FLV 时堆棧溢出解决 FluorineFx NetStream.play 并发时,无法全部连接成功的解决办法
Flex数据交互之Remoting[转]
fluorinefx使用手册
SharedObject使用:在FluorineFx.net与Flex中使用共享对象维护在线用户列表实例【转】
原文地址:https://www.cnblogs.com/ghd258/p/339458.html
最新文章
GIS案例学习笔记-水文分析河网提取地理建模
判断点在多边形内
感想——关于球
C#知识点备忘
Undo
DIY自己的GIS程序(1)——起航
Oracle SQL语句积累
分页显示
xsd
单元格合并??
热门文章
事件一二
Hook?
2.软件项目管理软件
角度和弧度的转换
度分秒和度的转换
通用权限管理系统数据权限设置功能解析
通用权限管理系统底层更换最新Oracle驱动的方法
一个比较完整的短信接口帮助类参考
发送加密短信参考
c#(.Net)解析xml
Copyright © 2011-2022 走看看