小弟才学sqlsever,和vb,有些地方不是很明白,望各位大哥指教一二!
我想实现数据库的备份还原操作,我实现的是服务器端的备份还原,备份部分已经成功,为测试数据库能否还原,我在数据库VIPDB(我所操作的数据库名),建立个用户表,然后把它备份,再在数据库里删除该表,如果是用sqlsever的数据库还原方法,能重新看到该表,而使用邹健兄的那部分代码没有能还原
邹健的那个程序
'*************************************************************************
'**模 块 名: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
我的数据库名为VIPDB,odbc建立的data source name = NewVipdb
我在
ConnectionString地方做了修改:
iConcStr = "PROVIDER=MSDataShape;Data PROVIDER=MSDASQL;dsn=NewVipdb;database=VIPDB;"
*********connection做了修改
以及在 每个小部分,加入MsgBox,来汇报各部分的执行情况
给该function的参数如下:
我使用了commondialog控件,通过commondialog的showopen方法,选择备份好的文件
fRestoreDatabase_a(dlgCommonDialog.FileName, "VIPDB")
我发现问题出在这块
'检查数据库是否存在
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
这部分代码,是通过判断数据库是否已经存在,如存在,则不还原数据库,而sqlsever的还原方法是,可以允许这个数据库存在,而直接还原数据库备份方法,即可还原。我做了个事情,我把那个数据库删了,sqlsever又提示我"无法打开登录VIPDB请求的那个数据库, 于是,我就重新建立了个VIPDB空数据库,把判断数据库是否存在部分注释掉了
程序走到了关闭用户进程那块, '关闭用户进程,防止其它用户正在使用数据库,导致数据恢复失败 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 sqlsever提示我不能用kill来取消自己的进程,而生成数据恢复语句处的MsgBox没有报告,那说明应该是有异常或错误发生了,fuction没有执行完所有代码就跳出了
我接着把关闭用户进程那块,也注释掉了,让它直接运行后面部分的代码,sqlsever 提示”因为数据库正在使用,未获得对数据库的排它访问权“ 我现在就有几个问题了,
1,为什么要判断数据库已经存在呢,sqlsever的数据库还原方法,不是数据库存在也能还原的吗??
2,为什么要出现kill自己的进程呢,后来看看代码,也这么句 iSql = "select spid from master..sysprocesses where dbid=db_id('" & sDataBaseName & "')",就是说把与该数据库相连的所有进程找出来,肯定也包括
还原数据库这个进程
3,kill的进程,是不是就是说和数据库VIPDB连接的除还原数据库的所有其他进程?
4,如果要不kill掉"还原数据库进程"自己,iSql = "select spid from master..sysprocesses where dbid=db_id('" & sDataBaseName & "')",应该在where语句里加什么样的判断条件
我想实现数据库的备份还原操作,我实现的是服务器端的备份还原,备份部分已经成功,为测试数据库能否还原,我在数据库VIPDB(我所操作的数据库名),建立个用户表,然后把它备份,再在数据库里删除该表,如果是用sqlsever的数据库还原方法,能重新看到该表,而使用邹健兄的那部分代码没有能还原
邹健的那个程序
'*************************************************************************
'**模 块 名: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
我的数据库名为VIPDB,odbc建立的data source name = NewVipdb
我在
ConnectionString地方做了修改:
iConcStr = "PROVIDER=MSDataShape;Data PROVIDER=MSDASQL;dsn=NewVipdb;database=VIPDB;"
*********connection做了修改
以及在 每个小部分,加入MsgBox,来汇报各部分的执行情况
给该function的参数如下:
我使用了commondialog控件,通过commondialog的showopen方法,选择备份好的文件
fRestoreDatabase_a(dlgCommonDialog.FileName, "VIPDB")
我发现问题出在这块
'检查数据库是否存在
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
这部分代码,是通过判断数据库是否已经存在,如存在,则不还原数据库,而sqlsever的还原方法是,可以允许这个数据库存在,而直接还原数据库备份方法,即可还原。我做了个事情,我把那个数据库删了,sqlsever又提示我"无法打开登录VIPDB请求的那个数据库, 于是,我就重新建立了个VIPDB空数据库,把判断数据库是否存在部分注释掉了
程序走到了关闭用户进程那块, '关闭用户进程,防止其它用户正在使用数据库,导致数据恢复失败 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 sqlsever提示我不能用kill来取消自己的进程,而生成数据恢复语句处的MsgBox没有报告,那说明应该是有异常或错误发生了,fuction没有执行完所有代码就跳出了
我接着把关闭用户进程那块,也注释掉了,让它直接运行后面部分的代码,sqlsever 提示”因为数据库正在使用,未获得对数据库的排它访问权“ 我现在就有几个问题了,
1,为什么要判断数据库已经存在呢,sqlsever的数据库还原方法,不是数据库存在也能还原的吗??
2,为什么要出现kill自己的进程呢,后来看看代码,也这么句 iSql = "select spid from master..sysprocesses where dbid=db_id('" & sDataBaseName & "')",就是说把与该数据库相连的所有进程找出来,肯定也包括
还原数据库这个进程
3,kill的进程,是不是就是说和数据库VIPDB连接的除还原数据库的所有其他进程?
4,如果要不kill掉"还原数据库进程"自己,iSql = "select spid from master..sysprocesses where dbid=db_id('" & sDataBaseName & "')",应该在where语句里加什么样的判断条件
2.是将所有记录该库的信息包括此库全部删除
3.没明白
4.没明白
在数据库VIPDB里新建个student表的,加入些数据,然后,我备份该数据库,再把那个student表删除掉,然后进行数据库还原操作,如果该表还原则,则说明数据库还原成功,
操作sqlsever的话,可以不删除数据库VIPDB,而直接还原数据库的,用它的方法,能看到表student还原了