以下是我参考别人的数据库备份程序,但在程序运行时
在FileCopy bpath, epath这行出现错误
实时错误'70'
拒绝的权限
我在程序中已经将数据库关闭了
可为什么还是 出现这样的错误?
有没有更好的解决办法?
如何在备份数据库是可以提示用户自己选择备份的路径?
请赐教
非常感谢Private Sub CmdBackup_Click()
Dim bpath, epath As String
    If Dir(App.Path & "\Backup\", vbDirectory) = "" Then
     MkDir App.Path & "\Backup\"
    End If
    If MsgBox("确定要进行数据备份?", vbYesNo + vbQuestion, "提示") = vbYes Then
        If db.State = adStateOpen Then db.Close
        Set db = Nothing
        bpath = "" & App.Path & "\" & "data\workhourdatabase.mdb"
        epath = "" & App.Path & "\Backup\" & Year(Date) & "-" & Month(Date) & ".mdb"
        FileCopy bpath, epath
        MsgBox "备份完毕  ", vbInformation, "数据备份"
        cn.Open
    Else
        Exit Sub
    End If
end sub

解决方案 »

  1.   

    Access数据库的修复、压缩、备份:Sub BackupMdb(StrBack As String)
        'StrBack是备份文件目的路径和名称
        Dim miJRO As jro.JetEngine
        Set miJRO = New jro.JetEngine
        miJRO.CompactDatabase "Provider=Microsoft.Jet.OLEDB.4.0; " _
            & "Data Source=" & App.Path & "\db1.mdb;" _
            & "Jet OLEDB:Database Password=abc", _ 
        "Provider=Microsoft.Jet.OLEDB.4.0; " _
            & "Data Source=" & StrBack & ";" _
            & "Jet OLEDB:Database Password=abc"       
    End SubPrivate Sub cmd_Click()
        Dim Str As String
        CommonDialog1.Filter = "数据库文件(*.mdb)|*.mdb"
        CommonDialog1.FilterIndex = 2
        CommonDialog1.DialogTitle = "选择备份文件名称"
        CommonDialog1.ShowOpen
        Str = CommonDialog1.FileName
        '检查目标文件名称是否存在,存在则要先删除
        If Dir(Str) <> "" Then
            Kill Str
        End If
        Call BackupMdb(Str)
        MsgBox "数据备份完成!为了你的数据安全,请经常备份数据库。", _
                    vbOKOnly + vbExclamation, "提示"
    End Sub
      

  2.   

    上面忘了说,要在工程中引用 Microsoft Jet and Replication Objects 2.1 library
      

  3.   

    关键的一句是:
    DBEngine.CompactDatabase DataPath, IIf(Right(SHstr, 1) = "\", SHstr & "smdb.bak", SHstr & "\smdb.bak"), False, False, SysDataPwd''DataPath  Mdb文件全路径   SHstr  备份路径  smdb.bak 备份后文件名  SysDataPwd 数据库密码    
      

  4.   

    Dim str As String
       Dim Lbool As Boolean
       
       str = "D:\bak\" + Format(Date, "yyyymmdd")
       
       MkDir (str)
       str = str + "\数据库备份001.dat"  '备份目的路径及名称
       
       Lbool = CopyFile([被备份的数据库路径及名称], str, True)
       If Lbool = False Then
          MsgBox "帐套数据时出错,因为:" + Err.Description + "(错误号:" + CStr(Err.Number) + ")", vbCritical, "有错误发生 . . . "
       Else
          MsgBox "备份完毕,您的备份文件存放路经及名称为:" + str
       End If
      

  5.   

    真的关闭了么?
    FileCopy语句 如果想要对一个已打开的文件使用,则会产生错误
    再检查!
    if rs.state<>1 then rs.close
    if cn.State<>1 then cn.close
    filecopy ...  ...
      

  6.   

    注意:增加一下语句:
    Public Declare Function CopyFile Lib "kernel32" Alias "CopyFileA" (ByVal SoureFile As String, ByVal DestFile As String, ByVal bBool As Boolean) As Boolean可直接用 CopyFile 来备份文件,即使原来的文件是打开的也可以的;
    注意:是 CopyFile 并非 FileCopy具体方法参照上上楼的写法!
    例如:
    FileSystemObject.CopyFile "c:\mydocuments\letters\*.doc", "c:\tempfolder\"But you can't use:FileSystemObject.CopyFile "c:\mydocuments\*\R1???97.xls", "c:\tempfolder"
      

  7.   

    也可用 VB 中的文件系统对象 FSO:FileSystemObject 来处理,FSO 使用基于对象工具来处理文件夹和文件,它使程序能够创建、改编、移动或者删除文件夹,并能检测指定的文件夹是否存在,以及获取关于文件夹的信息(如:名称、创建日期或者最近修改日起等):
    在使用时需要事先在 VB 中引用 “Microsoft Scripting Runtime”,该类型库位于:scrrun.dll 文件中。复制文件方法 CopyFile 同上!即:object.CopyFile source, destination[, overwrite]