备份后还原数据库有问题?

zuo191715 2003-12-01 03:50:05
Dim Server As New SQLDMO.SQLServer
  Dim DB As New SQLDMO.Database
  Dim BK As New SQLDMO.Backup
  Dim DV As New SQLDMO.BackupDevice
  
  Server.Connect "192.168.0.1", "SA"
  DV.Type = SQLDMODevice_DiskDump
  DV.Name = "MailBak"
  DV.PhysicalLocation = App.Path + "\MAILBAK.bak"
  
  On Error GoTo Err_Backup
  Server.BackupDevices.Add DV
  BK.Database = "Mail"
  BK.Devices = "MailBak"
  BK.Initialize = True
  BK.SQLBackup Server
  Server.BackupDevices.Remove "MailBak"

采用上面的程序进行数据库备份时,可以在原来数据库所在的机器上进行数据库还原,
但如果将上面的MailBak.bak文件拷贝到其他的机器后,在其他机器的SQL Server服务器中新建数据库Mail,并将此备份还原,则会出现错误以致不能还原(选择强制还原时也如此)。
由于对于SQL_DMO还使用的不太熟悉,所以只能写出上面的代码,而且理解不深。
我想知道用上面的代码实现的是不是“完全备份”并且是重写现有媒体。
哪位能不能帮帮我,或者给我一些这方面的资料? 
邮箱:zuomin@waveline.com
...全文
51 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjcxc 2003-12-09
  • 打赏
  • 举报
回复
'改用这个.

'*************************************************************************
'**模 块 名: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
Snow780311 2003-12-03
  • 打赏
  • 举报
回复
你好,能把你用vb实现的数据库备份和还原的程序发给我吗
liruixia783110@163.com
mingtian2008 2003-12-02
  • 打赏
  • 举报
回复
up
jpinglee 2003-12-02
  • 打赏
  • 举报
回复
同意
nik_Amis 2003-12-01
  • 打赏
  • 举报
回复
你要还原数据库,一定要保证改数据库不被使用
所以restore置前,请kill 掉所有使用该数据库的SPID

7,789

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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