问题的解决与改进

  感谢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>

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页