100分求教一个数据库备份的问题,回答后马上送分,谢谢!

yutingiee 2003-09-11 12:32:07
A.有一个数据库hospital,我想备份时弹出一个另存对话框,可以将此备份文件备份到我选择的局域网内任何一个共享的文件夹中(并且对此文件夹的操作只能输入密码时才能进行),如何做呢?
B.并且如何得到对话框中的路径,备份到其它机器上时有没有其它的区别???
C.我在SQL查询分析器里执行如下语句:
sp_addumpdevice 'disk','hospital','hospital.bak'
backup database hospital to hospital
restore database hospital from hospital
总是出现这样数据库 "因为数据库正在使用,所以未能获得对数据库的排它访问权"的错误。我想这样的原因是不是要关掉此前数据库hospital的联接,但怎么做呢?

第一次在程序里做数据库的备份,一点都不了解,如果你们原来做过这方面的,最好能贴上源码??解决了分还可再加!!!
再次表示感谢!!帮帮我!
...全文
35 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
yutingiee 2004-01-04
  • 打赏
  • 举报
回复
已结贴,但还是没找到可行性的方法,yassee(甲克虫)你有什么好方法吗?可以给我发短信,我可以另开贴送分.
yassee 2003-12-09
  • 打赏
  • 举报
回复
哦,备份数据库而已,怎么搞的这么复杂?~~
幸好最近我在公司老做这个工作,可以说是熟之又熟。
zjcxc 2003-12-09
  • 打赏
  • 举报
回复

'*************************************************************************
'**模 块 名: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
zjcxc 2003-12-09
  • 打赏
  • 举报
回复
SQL服务器上架设IIS服务,用ASP就可以备份并下载到本机..

'备份数据库并提供下载的asp文件
<%
Response.Buffer=true
Response.Clear

'根据你的情况修改用户名和密码
constr="Provider=SQLOLEDB.1;Persist Security Info=True;User ID=用户名;Password=密码;Data Source=(local)"

set conn=server.createobject("adodb.connection")
conn.open constr
bkfname=server.mappath("数据库备份.bak")
sqlstr="backup database pubs to disk='"+bkfname+"' with init"
conn.execute sqlstr
conn.close

set fn=server.createobject("adodb.stream")
fn.mode=3
fn.type=1
fn.open
fn.LoadFromFile bkfname
Response.ContentType="application/octet-stream"
Response.BinaryWrite fn.read
fn.close
%>
yoki 2003-11-07
  • 打赏
  • 举报
回复
1、备份数据库时,数据库不需要断开连接
2、恢复数据库时,数据库必须断开连接!
Lucky527 2003-11-07
  • 打赏
  • 举报
回复
'可备份日常数据,使得数据万无一失
'一天备无数次完全不经人手
'下面是本程序的源代码
'//////////////////////////////////////////////////////////

Private Sub Form_Load()
Dim Path As String '设置目录生成路径
Dim tmp 'shell函数执行变量
Dim DateName As String '数据库日期目录,从中提取月份和日期,并建立目录
Dim DayTime As String '时间缺省值
Dim Tim As String '数据库备份时间目录变量
Dim filepath '读取数据库备份的来源目录变量
'//////////////////////////////////////////////////////////

DayTime = "AM" '时间缺省值为早上
Tim = Trim(Format$(Str(Time), "hh_mm")) '设置日期格式为"时时_分分"
'下面判断备份时间是早上还是下午
If Int(Left(Tim, 2)) > 12 Then Tim = "0" & Trim(Str(Int(Left(Tim, 2)) - 12)) & Right(Tim, 2): DayTime = "PM"
'//////////////////////////////////////////////////////////////////////////////////////////////
MsgBox Tim
Tim = Left(Tim, 2) & "_" & Right(Tim, 2) '取时间值
DateName = Trim(Format$(Str$(Date), "mm_dd")) '设置日期格式为"月月_日日"

If Right(App.Path, 1) <> "\" Then '取当前软件运行路径
Path = App.Path & "\" & Left(DateName, 2) '设置备份月份路径变量
Else: Path = App.Path & Left(DateName, 2)
End If

tmp = Shell("command.com /c md " & Path) '生成备份月份路径变量
Path = Path + "\" + Right(DateName, 2) '设置备份日期路径变量
tmp = Shell("command.com /c md " & Path) '生成备份月份路径变量
DayTime = Trim(DayTime) & Trim(Tim) '得到备份时间目录名
Path = Path & "\" & DayTime '得到备份时间目录路径
tmp = Shell("command.com /c md " & Path) '生成备份时间目录
'///////////////////////////////////////////////////////////////////////////////////////////////
'打开数据来源设置文件并取得来源路径
If Right(App.Path, 1) <> "\" Then PH = App.Path & "\" & "copyfrom.ini"
Open PH For Input As #1
filepath = Input$(LOF(1), 1) '取得路径
If filepath = "" Then '如果为空,即提示错误并退出程序
MsgBox "拷贝路径没有设置好!"
Unload Form1
End If
filepath = Trim(filepath)
Close #1
tmp = Shell("command.com /c xcopy " + filepath + " " + Path) '生成时间子目录
Unload Form1 '完成后退出程序
End Sub
'/程序完成/
myhgyp 2003-09-27
  • 打赏
  • 举报
回复
问题可能出在s_dataexport = "BACKUP DATABASE hospital TO disk='" + dlgOpen.filename + "'"这句话之前,不应该用dlgopen.filename=c,因为c不带全路径,你再试一下吧.
lemonchen 2003-09-27
  • 打赏
  • 举报
回复
好东西
tmxsl1214 2003-09-27
  • 打赏
  • 举报
回复
学习
Jackile 2003-09-27
  • 打赏
  • 举报
回复
一个正确的答复:
1、备份数据库时,数据库不需要断开连接
2、恢复数据库时,数据库必须断开连接!
NotReady 2003-09-26
  • 打赏
  • 举报
回复
把数据库的连接关闭,直接用fileCopy进行复制
golden24kcn 2003-09-26
  • 打赏
  • 举报
回复
sql server的备份有很多可选参数,比如备份到设备\文件,增量\差异,日志\文件\日志+文件,备份到设备还可以加备份标识,各位老大?这些你们谁能讲讲??
wfwater 2003-09-26
  • 打赏
  • 举报
回复
mark
yutingiee 2003-09-25
  • 打赏
  • 举报
回复
Call strartPro
Call ConnectServer
两个函数是重新联接conn和rst
yutingiee 2003-09-25
  • 打赏
  • 举报
回复
'这是我的程序,
'*********************************************************************
Private Sub cmBackUP_Click()
Dim c As String
Dim s_path, s_dataexport As String
txtMsg = MsgBox("您确认备份此数据库吗?", vbQuestion + vbOKCancel, "提示")
If txtMsg = vbOK Then
Me.MousePointer = MOUSE_WAIT '设置鼠标指针形状
c = CStr(Year(Date)) + "年" + CStr(Month(Date)) + "月" + CStr(Day(Date)) + "日" + _
CStr(Hour(Time)) + "时" + CStr(Minute(Time)) + "分的数据库备份"
dlgOpen.filename = c
dlgOpen.ShowSave
s_path = App.Path
'hospital是需要备份的数据库名称

s_dataexport = "BACKUP DATABASE hospital TO disk='" + dlgOpen.filename + "'"
'这里不需要连接master数据库,即可完成备份

Conn.Execute s_dataexport
Conn.BeginTrans
Err.Number = 0
If Err.Number = 0 Then
Conn.CommitTrans
MsgBox "数据备份成功!", vbInformation, "提示"
MsgBox "数据备份文件存放路径:" & dlgOpen.filename, vbOKOnly, "提示"
Unload Me
Else
Conn.RollbackTrans
MsgBox "数据备份失败!请检查数据库是否正在打开!", vbCritical, "提示"
End If
Else
Exit Sub
End If
End Sub

Private Sub cmdRestore_Click()
Dim s_restore As String

ret = MsgBox("数据恢复操作将会覆盖以前的所有数据并且覆盖后无法恢复," & _
"您确定要进行恢复操作吗?", vbQuestion + vbOKCancel, "提示")
If ret = vbOK Then
Me.MousePointer = MOUSE_WAIT
Conn.Close
Set Conn = Nothing
Set Cn = New ADODB.Connection
Const ConnString = "Provider=SQLOLEDB.1;" & _
"Integrated Security=SSPI;" & _
"Persist Security Info=False;" & _
"Initial Catalog=master"
Cn.Open ConnString
dlgOpen.ShowOpen
s_restore = "RESTORE DATABASE hospital from disk='" + dlgOpen.filename + "' WITH REPLACE"
Cn.Execute s_restore
Cn.BeginTrans
If Err.Number = 0 Then
Cn.CommitTrans
MsgBox "数据恢复成功!", vbInformation, "提示"
Else
Cn.RollbackTrans
MsgBox "数据恢复失败!", vbCritical, "提示"
End If
Cn.Close
Set Cn = Nothing
Me.MousePointer = 1
Call strartPro
Call ConnectServer
Else
Exit Sub
End If
End Sub
'**********************************************
以上程序可以备份到自己的机器上,但不可以备份到别人的机器上.即在网络上是不可用的.没有提示错误,但是确找不到备份文件.
如果用存储过程sp_addumpdevice事先指定备份路径,无论路径如何,则总会将此文件备份到SQL安装目录中的backup的文件夹中,不知是何原因.
Gelim 2003-09-25
  • 打赏
  • 举报
回复
用读语句备份,虽然很慢,但是不用关闭别人已经打开的数据库!
wingchi 2003-09-24
  • 打赏
  • 举报
回复
添加一个commondialog控件,名称为dlg,我要备份和恢复的数据库名字为hy,执行备份的语句就是
sql = "BACKUP DATABASE hy TO disk='" & dlg.FileName & "'"
Cn.Execute (sql)
恢复的语句:
sql = "RESTORE DATABASE hy FROM disk='" & dlg.FileName & "' WITH replace"
Cn.Execute (sql)

1、备份数据库代码
Dim Ret As String

'备份数据库hy
Ret = MsgBox("备份主要数据库--hy ?", vbOKCancel + vbInformation, "提示")
If Ret = vbOK Then

dlg.CancelError = False
dlg.Filter = "(*.bak)|*.bak"

dlg.ShowSave
'如果dlg控件点击取消
If dlg.FileName = "" Then
Exit Sub
End If
If Dir(dlg.FileName) <> "" Then
If MsgBox("文件" & dlg.FileName & "已存在!要替换吗?", vbYesNo, "提示") = vbYes Then
Kill dlg.FileName
Else
Exit Sub
End If
End If
'执行备份

connectString="Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Password=;Data Source=hh-zhou;Initial Catalog=master"
MousePointer = 11
Dim Cn As New ADODB.Connection
If Cn.State = adStateOpen Then Cn.Close
Cn.ConnectionTimeout = 10

Cn.Open ConnectString

sql = "BACKUP DATABASE hy TO disk='" & dlg.FileName & "'"
Cn.Execute (sql)

Cn.Close
Set Cn = Nothing
MousePointer = 0
End If

2、恢复数据库代码

Dim Ret As String
Ret = MsgBox("恢复主要数据库--hy?数据恢复操作将会覆盖以前的所有数据并且覆盖后无法恢复,您确定要进行恢复操作吗?", vbOKCancel + vbInformation, "提示")
If Ret = vbOK Then

dlg.CancelError = False
dlg.Filter = "(*.bak)|*.bak"
dlg.ShowOpen

If dlg.FileName = "" Then
Exit Sub
End If

If Dir(dlg.FileName) = "" Then
MsgBox "文件" & dlg.FileName & "不存在!", vbOKOnly + vbInformation, "提示"
Exit Sub
End If

MousePointer = 11

Dim Cn As New ADODB.Connection
Dim rst As New ADODB.Recordset
connectString="Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Password=;Data Source=hh-zhou;Initial Catalog=master"
If Cn.State = adStateOpen Then Cn.Close
Cn.ConnectionTimeout = 10

Cn.Open ConnectString
rst.Open "select spid from sysprocesses where dbid=db_id('hy')", Cn
Do While Not rst.EOF
Cn.Execute "kill " & rst("spid") '杀掉sql服务器的所有连接,否则会出现:数据库正在使用,无法完成排它操作等等,很重要
rst.MoveNext
Loop
rst.Close
sql = "RESTORE DATABASE hy FROM disk='" & dlg.FileName & "' WITH replace"
Cn.Execute (sql)

MousePointer = 0
Cn.Close
Set Cn = Nothing
MsgBox "数据库'hy'恢复成功!", vbOKOnly + vbInformation, "操作成功"
End If
strongfisher 2003-09-24
  • 打赏
  • 举报
回复
gz
守城小轩 2003-09-24
  • 打赏
  • 举报
回复
gz
'======================QQYY_sj==========================
wingchi 2003-09-24
  • 打赏
  • 举报
回复
jinhai2003(飞鱼)这样不行吗?只能帮你up了
加载更多回复(8)

1,216

社区成员

发帖
与我相关
我的任务
社区描述
VB 数据库(包含打印,安装,报表)
社区管理员
  • 数据库(包含打印,安装,报表)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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