问题的解决与改进

    技术2022-05-11  150

      感谢boyd大人提供的方法。看后我幡然醒悟:要在与数据库交互才能进入的管理系统中恢复数据结构,就犹如站在树枝上锯树干。

      于是我在这里用了双数据库。将基本表(用户信息、菜单信息)置于数据库A中,以构成管理系统的框架;其余大量数据置于数据库B中,这样便可在A框架下备份恢复数据库B。

      在boyd的方法以及大众方法中,存在这样的问题:每备份数据库一次,备份文件便会成倍增大,新旧数据共处于一个文件中,要恢复某次的备份数据很困难。

      因而我在备份时用某次的时间命名文件,并把路径和文件名记录到数据库A。再把用户最后一次录入文本框的内容滞留下来。在默认情况下恢复的是最近一次备份数据,用户也可选择之前某次的备份文件来进行恢复。

      核心源代码如下:

      <!--#include file="../login/check.asp" -->  <!--#include file="../../inc/conn1.asp" -->  <!--#include file="../../inc/function.asp" -->

      <HTML>

      <BODY>

      <FORM  method="post" name="form1">

      <table width="100%" height="136">

        <tr><td width="25%" height="32">选择操作:</td>

           <td width="75%">

             <INPUT TYPE="radio" NAME="act" id="act_backup"  value="backup">备份          

                <INPUT TYPE="radio" NAME="act" id="act_restore" value="restore">恢复

           </td></tr>

        <tr><td height="32">数据库名:</td>

         <td><INPUT TYPE="text" NAME="databasename" value="FTS">输入要操作的数据库名</td>

        </tr>

        <tr><td height="30">文件路径:</td>

          <td height="30">

             <%  '这里是选取出最后一次输入的路径与文件名,表DBinfo的id设为自动增长型      dim Rs,Sql,Sql1,pathinfo,num

                                sql="Select Max(id) From DBinfo"

                                Set rs= Server.CreateObject("ADODB.Recordset")

                                 rs.open sql,conn,1,1

                                 num=Rs(0)

                                                      

                                  sql1="select * from DBinfo where id="&num

                                  Set rs= Server.CreateObject("ADODB.Recordset")

                                  rs.open sql1,conn,1,1

                                  pathinfo=Rs("PathInfo")            %>

             <INPUT TYPE="text" NAME="bak_file" value="<%=pathinfo%>">输入存储的路径及名称</td>

        </tr>

        <tr><td height="30"></td>

          <td height="30">

       '这里要确认一下操作

          <input type="submit" onClick="{if(confirm('确定所选定的操作吗!?')){this.document.submit();return true;}return false;}" value="  ">

          </td> </tr>

       </table>

     

    <%

    dim sqlserver,sqlname,sqlpassword,sqlLoginTimeout,databasename,bak_file,act

    sqlserver = "TENGHE-YEXX"        

    sqlname = "sa"  

    sqlpassword = "" 

    sqlLoginTimeout = 15

    databasename = trim(request("databasename"))

    bak_file = trim(request("bak_file")) act = lcase(request("act"))if databasename = "" then

     response.write "<font color=red>请输入要备份或恢复的数据库名,并暂停其它数据库操作!</font>"

    else

     if act = "backup" then

      Set srv=Server.CreateObject("SQLDMO.SQLServer")

      srv.LoginTimeout = sqlLoginTimeout

      srv.Connect sqlserver,sqlname, sqlpassword

      Set bak = Server.CreateObject("SQLDMO.Backup")

      bak.Database=databasename

      bak.Devices=Files

      bak.Files=bak_file

      bak.SQLBackup srv

     

     '弹出提示窗口表示操作成功或失败 on error resume next

     If err Then

         Call showerror("出错了,数据库备份失败!")

     Else

           Call showsuccess("备份成功","backup.asp")

     End If '备份成功后记录备份路径与文件名

        set rs=server.createobject("adodb.recordset")

        rs.open "DBinfo",conn,1,2

        rs.addnew

        rs("PathInfo") = bak_file

        rs.update

     

     elseif act = "restore" then

      '恢复时要在没有使用数据库时进行!

      Set srv=Server.CreateObject("SQLDMO.SQLServer")

      srv.LoginTimeout = sqlLoginTimeout

      srv.Connect sqlserver,sqlname, sqlpassword

      Set rest=Server.CreateObject("SQLDMO.Restore")

      rest.Action=0 ' full db restore

      rest.Database=databasename

      rest.Devices=Files

      rest.Files=bak_file

      rest.ReplaceDatabase=True 'Force restore over existing database

      rest.SQLRestore srv

      on error resume next

    If err Then

         Call showerror("出错了,数据库恢复失败!")

    Else

           Call showsuccess("恢复成功","backup.asp")

    End If

     

     

     end if

    end if

    %>

      </div>

    </FORM>

    </BODY>

    </HTML>


    最新回复(0)