关于SQL Server数据库的恢复问题!

ghy412 2004-08-06 05:21:16
我想在后台做一个数据库恢复的功能,代码如下:
Sub restore()
response.Write conn.state '测试为1
response.Write("<br>")
conn.close
response.Write conn.state '测试为0
Set conn=nothing
Set conn=Server.CreateObject("ADODB.Connection")
conn.ConnectionString="driver={sql server};server=pc002;UID=sa;PWD=123;DataBase=master"
conn.open
filename=trim(Request.form("select"))
If filename="-" Then
msg="还没有备份,不能还原!"
Call Succe_Msg(msg)
Else
Set fs=Server.CreateObject("Scripting.FileSystemObject")
If fs.FileExists(server.MapPath("databasebackup")&"\"&filename) Then
sql="Restore Database goods From Disk='"&server.MapPath("databasebackup")&"\"&filename&"' with file=1"
response.Write sql '载查询分析器里能够恢复
conn.Execute sql
Else
msg="没有这个备份文件,请重新选择!"
Call Error_Msg(msg)
End If
End If
conn.Close
Set conn=nothing
End Sub
%>
错误提示:因为数据库正在使用,所以未能获得对数据库的排它访问权。
请问各位大虾,怎么解决?
...全文
169 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangjinmin1982 2004-08-08
  • 打赏
  • 举报
回复
**模 块 名:fBackupDatabase_a
'**描 述:备份数据库,返回出错信息,正常恢复,返回""
'**调 用:fBackupDatabase_a "备份文件名","数据库名"
'**参数说明:
'** sBackUpfileName 恢复后的数据库存放目录
'** sDataBaseName 备份的数据名
'** sIsAddBackup 是否追加到备份文件中
'**说 明:引用Microsoft ActiveX Data Objects 2.x Library
'**创 建 人:邹建
'**日 期:2003年12月09日
'*************************************************************************
Public Function fBackupDatabase_a(ByVal sBackUpfileName$ _
, ByVal sDataBaseName$ _
, Optional ByVal sIsAddBackup As Boolean = False _
) As String

Dim iDb As ADODB.Connection
Dim iConcStr$, iSql$, iReturn$

On Error GoTo lbErr

'创建对象
Set iDb = New ADODB.Connection

'连接数据库服务器,根据你的情况修改连接字符串
iConcStr = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Data Source=zj"
iDb.Open iConcStr

'生成数据库备份语句
iSql = "backup database [" & sDataBaseName & "]" & vbCrLf & _
"to disk='" & sBackUpfileName & "'" & vbCrLf & _
"with description='" & "zj-backup at:" & Date & "(" & Time & ")'" & vbCrLf & _
IIf(sIsAddBackup, "", ",init")

iDb.Execute iSql
GoTo lbExit

lbErr:
iReturn = Error
lbExit:
fBackupDatabase_a = iReturn
End Function

'*************************************************************************
'**模 块 名:frestoredatabase_a
'**描 述:恢复数据库,返回出错信息,正常恢复,返回""
'**调 用:frestoredatabase_a "备份文件名","数据库名"
'**参数说明:
'** sDataBasePath 恢复后的数据库存放目录
'** sBackupNumber 是从那个备份号恢复
'** sReplaceExist 指定是否覆盖已经存在的数据
'**说 明:引用Microsoft ActiveX Data Objects 2.x Library
'**创 建 人:邹建
'**日 期:2003年12月09日
'*************************************************************************
Public Function fRestoreDatabase_a(ByVal sBackUpfileName$ _
, ByVal sDataBaseName$ _
, Optional ByVal sDataBasePath$ = "" _
, Optional ByVal sBackupNumber& = 1 _
, Optional ByVal sReplaceExist As Boolean = False _
) As String

Dim iDb As ADODB.Connection, iRe As ADODB.Recordset
Dim iConcStr$, iSql$, iReturn$, iI&

On Error GoTo lbErr

'创建对象
Set iDb = New ADODB.Connection
Set iRe = New ADODB.Recordset

'连接数据库服务器,根据你的情况修改连接字符串
iConcStr = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Data Source=zj"
iDb.Open iConcStr

'得到还原后的数据库存放目录,如果没有指定,存放到SQL SERVER的DATA目录
If sDataBasePath = "" Then
iSql = "select filename from master..sysfiles"
iRe.Open iSql, iDb, adOpenKeyset, adLockReadOnly
iSql = iRe(0)
iRe.Close
sDataBasePath = Left(iSql, InStrRev(iSql, "\"))
End If

'检查数据库是否存在
If sReplaceExist = False Then
iSql = "select 1 from master..sysdatabases where name='" & sDataBaseName & "'"
iRe.Open iSql, iDb, adOpenKeyset, adLockReadOnly
If iRe.EOF = False Then
iReturn = "数据库已经存在!"
iRe.Close
GoTo lbExit
End If
iRe.Close
End If

'关闭用户进程,防止其它用户正在使用数据库,导致数据恢复失败
iSql = "select spid from master..sysprocesses where dbid=db_id('" & sDataBaseName & "')"
iRe.Open iSql, iDb, adOpenKeyset, adLockReadOnly
While iRe.EOF = False
iSql = "kill " & iRe(0)
iDb.Execute iSql
iRe.MoveNext
Wend
iRe.Close

'获取数据库恢复信息
iSql = "restore filelistonly from disk='" & sBackUpfileName & "'" & vbCrLf & _
"with file=" & sBackupNumber
iRe.Open iSql, iDb, adOpenKeyset, adLockReadOnly

'生成数据库恢复语句
iSql = "restore database [" & sDataBaseName & "]" & vbCrLf & _
"from disk='" & sBackUpfileName & "'" & vbCrLf & _
"with file=" & sBackupNumber & vbCrLf
With iRe
While Not .EOF
iReturn = iRe("PhysicalName")
iI = InStrRev(iReturn, ".")
iReturn = IIf(iI = 0, "", Mid(iReturn, iI)) & "'"
iSql = iSql & ",move '" & iRe("LogicalName") & _
"' to '" & sDataBasePath & sDataBaseName & iReturn & vbCrLf
.MoveNext
Wend
.Close
End With
iSql = iSql & IIf(sReplaceExist, ",replace", "")

iDb.Execute iSql
iReturn = ""
GoTo lbExit

lbErr:
iReturn = Error
lbExit:
fRestoreDatabase_a = iReturn
End Function

posted on 2004年05月27日 2:41 AM

Feedback
# 回复:VB实现SQL Server数据库备份/恢复 2004-07-28 12:20 AM yzy
站长,你好。
这个程序你试过吗?

Johnyin 2004-08-08
  • 打赏
  • 举报
回复
做个记号先。
twenth 2004-08-08
  • 打赏
  • 举报
回复
你要把所有的访问进程杀掉:
这个没问题:
sqlRestore="use master alter database lab set RESTRICTED_USER with rollback immediate"
sqlRestore=sqlRestore&" Restore DataBase lab From disk='"&request("restorePath")&"'"
sqlRestore=sqlRestore&"alter database lab set MULTI_USER with rollback immediate"
ghy412 2004-08-07
  • 打赏
  • 举报
回复
我这个是用数据库存表名的 不好 那位有更好的办法?
我又想过用文件,但不知道怎么把它都取到select中.
wangjinmin1982 2004-08-06
  • 打赏
  • 举报
回复
快帮忙啊!
我比较菜
ghy412 2004-08-06
  • 打赏
  • 举报
回复
是呀,不会吧? 你把在查询分析器里恢复当前库 试试看是不是这个错误提示
cdsun 2004-08-06
  • 打赏
  • 举报
回复
SQL Server我还没见过这种问题阿

因为数据库正在使用,所以未能获得对数据库的排它访问权。????

这个错误?
cdsun 2004-08-06
  • 打赏
  • 举报
回复
你是什么数据库啊?
ghy412 2004-08-06
  • 打赏
  • 举报
回复
失望................
ghy412 2004-08-06
  • 打赏
  • 举报
回复
不是吧? 怎么没人帮忙呀!! 分数是少了点,都是因为这几天不知道怎么了,可用分一直不加,我也没了:(。要是有幸得到斑竹的光临,请顺便把这个问题也答了吧:)

28,409

社区成员

发帖
与我相关
我的任务
社区描述
ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
社区管理员
  • ASP
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧