以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  如何通过一个自制按键实现数据备份与恢复  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=11225)

--  作者:zstk7333
--  发布时间:2011/7/14 8:56:00
--  如何通过一个自制按键实现数据备份与恢复

我想在我的程序界面的主菜单上制作两个按键,分别是数据备份和数据恢复,想请教一下,可否给出一个代码?谢谢


--  作者:雨中的泪
--  发布时间:2011/7/14 9:27:00
--  
 

(五)、<备份数据>按钮代码:

Dim dlg As New SaveFileDialog   \'指定一个新的SaveFileDialog
dlg.Filter= "备份文件|*.DBF "   \'设置筛选器

dlg. title= "备份数据"
dlg.OverwritePrompt = True  \'对于已经存在的文件名,是否出现覆盖警告

If dlg.ShowDialog = DialogResult.Ok Then   \'如果用户单击了确定按钮

If FileSys.FileExists(dlg.filename) Then    \'如果指定的文件存在
    FileSys.DeleteFile(dlg.filename,2,2)     \'则彻底删除之
    End If
    Dim ex as New Exporter
    ex.SourceTableName = "调资基础数据"   \'指定导出表

ex.Format = "Access"   \'指定导出文件格式
    ex. PassWord = “TZX_GWY_JT_8888”  \'用此属性指定目标文件的密码

ex.filepath =  dlg.filename    \'指定目标文件

ex.NewTableName = "调资基础数据"        \'指定导出后的表的名称

    ex.Export()    \'开始导出数据
    MessageBox.Show(备份数据生成完成!!!", "提示", MessageBoxButtons.OK,MessageBoxIcon.Information)
End If

 

修改代码(带有数据库加密):

Dim dlg As New SaveFileDialog   \'指定一个新的SaveFileDialog

dlg.Filter= "备份文件|*.DBF"   \'设置筛选器

dlg. title= "备份数据"

dlg.OverwritePrompt = False

If dlg.ShowDialog = DialogResult.Ok Then   \'如果用户单击了确定按钮

    If FileSys.FileExists(dlg.filename) Then    \'如果指定的文件存在

        if Messagebox.Show("有同名文件存在,是否删除?", "提示", MessageBoxButtons.YesNo,MessageBoxIcon.Question) = DialogResult.Yes then

            FileSys.DeleteFile(dlg.filename,2,2)  \'则彻底删除之

        Else

            Return

        End if

    End If

    Dim ex as New Exporter

    ex.SourceTableName = "调资基础数据"   \'指定导出表

    ex.Format = "Access"   \'指定导出文件格式

    ex. PassWord = "TZX_GWY_JT_8888"  \'用此属性指定目标文件的密码

    ex.filepath =  dlg.filename    \'指定目标文件

    ex.NewTableName = "调资基础数据"        \'指定导出后的表的名称

    ex.Export()    \'开始导出数据

    FileSys.CopyFile(dlg.filename, dlg.filename & ".bak",False)

    FileSys.DeleteFile(dlg.filename, 2, 2)

    EncryptFile(dlg.filename & ".bak", dlg.filename, "8888")

    FileSys.DeleteFile(dlg.filename & ".bak", 2, 2)

    MessageBox.Show("备份数据生成完成!", "提示", MessageBoxButtons.OK,MessageBoxIcon.Information)

End If

 

(六)、<恢复数据>按钮代码:

(1)、原代码:

If MessageBox.Show( "恢复数据库操作将清空数据库,确定是否清空?","提示",MessageBoxButtons. YesNo,MessageBoxIcon.Question) = DialogResult.Yes then

DataTables("调资基础数据").DataRows.Clear()  \'清空指定表数据

Else

     Return       \'点击否终止代码的执行

End If

Dim dlg As New OpenFileDialog    \'定义一个新的OpenFileDialog

dlg.Filter= "备份文件|*.DBF"        \'设置筛选器

dlg. title= "数据恢复"  

If dlg.ShowDialog = DialogResult.Ok Then       \'如果用户单击了确定按钮

Dim ip as New Merger  

ip.SourcePath = dlg.filename  \'指定数据文件

ip.SourceTableName = "调资基础数据"      \'指定要合并的表

ip.Format = "Access" \'指定合并文件格式

ip. PassWord = “TZX_GWY_JT_8888”  \'用此属性指定合并文件的密码

ip.Fields = “单位名称”   \' 指定要合并的字段(列)

ip. DataTableName ="数据接收临时判断" \'合并后的表名

ip. Merge()   \'开始合并

Dim dws As List(Of String)       \'定义一个字符型数组集合

 dws = DataTables("调资基础数据").GetUniqueValues("", "单位名称") \'列出所有单位

 For each dw As String In dws \'逐个单位判断

    Dim dr As DataRow = DataTables("数据接收临时判断").find("[单位名称] = \'" & dw & "\'")

        If dr IsNot Nothing Then

           If MessageBox.Show( dw & "的记录已经存在,确定是否请删除?","提示",MessageBoxButtons. YesNo,MessageBoxIcon.Question) = DialogResult.Yes then

     DataTables("调资基础数据").DeleteFor("[单位名称] = \'" & dw & "\'")

Else

     Return       \'点击否终止代码的执行

End If

      End If

 Next

 Dim mg As New Merger

 mg.SourcePath = dlg.filename

 mg.SourceTableName = "调资基础数据"

 mg.Format = "Access"

 mg. PassWord = "TZX_GWY_JT_8888"

 mg.DataTableName = "调资基础数据"

 mg.Merge()

 MessageBox.Show("数据恢复完成!!!","提示",MessageBoxButtons.OK,MessageBoxIcon.Question)

DataTables("数据接收临时判断").DataRows.Clear()  \'清空指定表数据

   End If

(2)、简化代码:

If MessageBox.Show( "恢复数据库操作将清空数据库,确定是否清空?","提示",MessageBoxButtons. YesNo,MessageBoxIcon.Question) = DialogResult.Yes then

DataTables("调资基础数据").DataRows.Clear()  \'清空指定表数据

Else

     Return       \'点击否终止代码的执行

End If

Dim dlg As New OpenFileDialog    \'定义一个新的OpenFileDialog

dlg.Filter= "备份文件|*.DBF"        \'设置筛选器

dlg. title= "数据恢复"  

If dlg.ShowDialog = DialogResult.Ok Then       \'如果用户单击了确定按钮

Dim mg As New Merger

 mg.SourcePath = dlg.filename

 mg.SourceTableName = "调资基础数据"

 mg.Format = "Access"

 mg. PassWord = "TZX_GWY_JT_8888"

 mg.DataTableName = "调资基础数据"

 mg.Merge()

 MessageBox.Show("数据恢复完成!!!","提示",MessageBoxButtons.OK,MessageBoxIcon.Question)

Else

 MessageBox.Show( "数据库已被清空!!!","提示",MessageBoxButtons. OK,MessageBoxIcon.Warning)

   End If

 

 

(3)、修改代码(带有数据库加密):

If MessageBox.Show( "恢复数据库操作将清空数据库,确定是否清空?","提示",MessageBoxButtons. YesNo,MessageBoxIcon.Question) = DialogResult.Yes then

DataTables("调资基础数据").DataRows.Clear()  \'清空指定表数据

Else

     Return       \'点击否终止代码的执行

End If

Dim dlg As New OpenFileDialog    \'定义一个新的OpenFileDialog

dlg.Filter= "备份文件|*.DBF"        \'设置筛选器

dlg. title= "数据恢复"  

If dlg.ShowDialog = DialogResult.Ok Then       \'如果用户单击了确定按钮

FileSys.CopyFile(dlg.filename, dlg.filename & ".bak",False)

FileSys.DeleteFile(dlg.filename, 2, 2)

DecryptFile (dlg.filename & ".bak", dlg.filename, "8888")

FileSys.DeleteFile(dlg.filename & ".bak", 2, 2)

Dim ip as New Merger  

ip.SourcePath = dlg.filename  \'指定数据文件

ip.SourceTableName = "调资基础数据"      \'指定要合并的表

ip.Format = "Access" \'指定合并文件格式

ip. PassWord = "TZX_GWY_JT_8888"  \'用此属性指定合并文件的密码

ip.Fields = "单位名称"   \' 指定要合并的字段(列)

ip. DataTableName ="数据接收临时判断" \'合并后的表名

ip. Merge()   \'开始合并

Dim dws As List(Of String)       \'定义一个字符型数组集合

 dws = DataTables("调资基础数据").GetUniqueValues("", "单位名称") \'列出所有单位

 For each dw As String In dws \'逐个单位判断

    Dim dr As DataRow = DataTables("数据接收临时判断").find("[单位名称] = \'" & dw & "\'")

        If dr IsNot Nothing Then

           If MessageBox.Show( dw & "的记录已经存在,确定是否请删除?","提示",MessageBoxButtons. YesNo,MessageBoxIcon.Question) = DialogResult.Yes then

     DataTables("调资基础数据").DeleteFor("[单位名称] = \'" & dw & "\'")

Else

FileSys.CopyFile(dlg.filename, dlg.filename & ".bak",False)

     FileSys.DeleteFile(dlg.filename, 2, 2)

     EncryptFile(dlg.filename & ".bak", dlg.filename, "8888")

     FileSys.DeleteFile(dlg.filename & ".bak", 2, 2)

     Return       \'点击否终止代码的执行

End If

      End If

 Next

 Dim mg As New Merger

 mg.SourcePath = dlg.filename

 mg.SourceTableName = "调资基础数据"

 mg.Format = "Access"

 mg. PassWord = "TZX_GWY_JT_8888"

 mg.DataTableName = "调资基础数据"

 mg.Merge()

 MessageBox.Show("数据恢复完成!!!","提示",MessageBoxButtons.OK,MessageBoxIcon.Question)

DataTables("数据接收临时判断").DataRows.Clear()  \'清空指定表数据

FileSys.CopyFile(dlg.filename, dlg.filename & ".bak",False)

     FileSys.DeleteFile(dlg.filename, 2, 2)

     EncryptFile(dlg.filename & ".bak", dlg.filename, "8888")

     FileSys.DeleteFile(dlg.filename & ".bak", 2, 2)

Else

 MessageBox.Show( "数据库已被清空!!!","提示",MessageBoxButtons. OK,MessageBoxIcon.Warning)

   End If

(4)、修改代码(带有数据库加密)简化代码:

If MessageBox.Show( "恢复数据库操作将清空数据库,确定是否清空?","提示",MessageBoxButtons. YesNo,MessageBoxIcon.Question) = DialogResult.Yes then

DataTables("调资基础数据").DataRows.Clear()  \'清空指定表数据

Else

     Return       \'点击否终止代码的执行

End If

Dim dlg As New OpenFileDialog    \'定义一个新的OpenFileDialog

dlg.Filter= "备份文件|*.DBF"        \'设置筛选器

dlg. title= "数据恢复"  

If dlg.ShowDialog = DialogResult.Ok Then       \'如果用户单击了确定按钮

FileSys.CopyFile(dlg.filename, dlg.filename & ".bak",False)

FileSys.DeleteFile(dlg.filename, 2, 2)

DecryptFile (dlg.filename & ".bak", dlg.filename, "8888")

FileSys.DeleteFile(dlg.filename & ".bak", 2, 2)

Dim mg As New Merger

 mg.SourcePath = dlg.filename

 mg.SourceTableName = "调资基础数据"

 mg.Format = "Access"

 mg. PassWord = "TZX_GWY_JT_8888"

 mg.DataTableName = "调资基础数据"

 mg.Merge()

 MessageBox.Show("数据恢复完成!!!","提示",MessageBoxButtons.OK,MessageBoxIcon.Question)

FileSys.CopyFile(dlg.filename, dlg.filename & ".bak",False)

     FileSys.DeleteFile(dlg.filename, 2, 2)

     EncryptFile(dlg.filename & ".bak", dlg.filename, "8888")

     FileSys.DeleteFile(dlg.filename & ".bak", 2, 2)

Else

 MessageBox.Show( "数据库已被清空!!!","提示",MessageBoxButtons. OK,MessageBoxIcon.Warning)

   End If


--  作者:lihe60
--  发布时间:2011/7/14 9:29:00
--  

适合SQL吗?


--  作者:baoxyang
--  发布时间:2011/7/14 9:47:00
--  
SQL有自动备份的。可以建立一个数据库维护计划,来实现定期备份。
--  作者:zstk7333
--  发布时间:2011/9/4 22:56:00
--  
好的,谢谢!
--  作者:yjk1023
--  发布时间:2011/9/4 23:20:00
--  
收藏了
--  作者:790729
--  发布时间:2011/11/6 18:43:00
--  

收藏,谢谢!


--  作者:lyqwzdzdhan
--  发布时间:2012/9/19 20:56:00
--  

首先感谢2楼,代码对我帮助很大.但是我觉得2楼的恢复数据的代码有一点问题,如果在筛选器里没有找到自己想要的备份文件的话(例如在没有备份的情况下使用恢复),那样不但没有办法恢复数据,而且连数据库都删掉了,所以在2楼的基础上,我觉得应该修改一下,修改之后会首先显示筛选器,当用户选定备份文件点击打开之后才会出现清空数据库的选项,而且在这个时候用户还是可以选择取消,这样就不会出现一点错成万古恨的现象了,修改后的代码如下,请指正批评:

 

Dim dlg As New OpenFileDialog    \'定义一个新的OpenFileDialog

    dlg.Filter= "备份文件|*.DBF"        \'设置筛选器

    dlg. title= "数据恢复"  

    If dlg.ShowDialog = DialogResult.Ok Then       \'如果用户单击了确定按钮

    If MessageBox.Show( "恢复数据库操作将清空数据库,确定是否清空?","提示",MessageBoxButtons. YesNo,MessageBoxIcon.Question) = DialogResult.Yes Then

       DataTables("调资基础数据").DataRows.Clear()  \'清空指定表数据

    Else

       Return       \'点击否终止代码的执行

    End If

Dim mg As New Merger

 mg.SourcePath = dlg.filename

 mg.SourceTableName = "调资基础数据"

 mg.Format = "Access"

 mg. PassWord = ""

 mg.DataTableName = "调资基础数据"

 mg.Merge()

 MessageBox.Show("数据恢复完成!!!","提示",MessageBoxButtons.OK,MessageBoxIcon.Question)

Else

 MessageBox.Show( "数据库已被清空!!!","提示",MessageBoxButtons. OK,MessageBoxIcon.Warning)

   End If