zoukankan      html  css  js  c++  java
  • 对服务器上SQLServer数据进行备份和下载

    动机

        虽然SqlServer可以远程注册和使用,但不能备份数据库到本地。为了能够在本地也用此数据库,需要将服务器上的数据库备份后下载到本地。
       
        对于有些服务器上并没有安装.net运行环境,所以采用了asp,对于有些服务器上没有安装office环境,采用了xml存储信息。


    关键字:DreamWeaver,ASP,XML


    设计过程
        1   IIS新建虚拟目录,Dreamweaver新建站点

        2   index.asp:
            <%Option Explicit%>  --是对asp变量的一种约束
            <!--#include file="conn.asp"-->  --引用conn.asp文件,#include使它不再是注释
            读取数据库名称:
            dim rs01
     set rs01 = server.CreateObject("adodb.recordset")
     rs01.open "select * from sysdatabases",objConn,1,1
            while not rs01.eof
                ***
                rs01.movenext
            wend
            rs01.close
            --select * from sysdatabases 是指取得所有数据库信息,其中name字段是数据库名称,前提是在master数据库下操作
            备份名称:
            function ChkDataBaseName(obj)
     {
      document.all("TxtBakName").value=obj.value + <%=year(date)%> + <%=month(date)%> + <%=day(date)%> + <%=hour(time)%> + <%=minute(time)%> + <%=second(time)%>;
     }
            --得到的是index.asp打开的时间,而不是真正现在的时间
            转到add.asp:
            function Add()
     {
      if(document.all("SelDataBase").value==""){alert('请选择数据库');return false;}
      document.form1.action="add.asp";
     }
            --action可以在form1属性里直接加上action="add.asp",但这样在做onClick="Add();"时遇到return false后仍然转到add.asp做相关操作,这会add.asp页面错误,所以在这里加上document.form1.action="add.asp";

        3   databasebakinfo.xml:
            <?xml version="1.0" encoding="gb2312"?>  --有的是encoding="UTF-8",我没发现现在用它们有什么区别
            <databasebaks>
                <databasebak>
                    <bakname>PMKL200812010274</bakname>
                    <baktime>2008-1-20 10:27:08</baktime>
                    <bakip>127.0.0.1</bakip>
                </databasebak>
            </databasebaks>
            --一定要有最外的<databasebaks></databasebaks>一层

        4   databasebakinfo.xsl:
            将处理xml的方式都放到xsl很方便
            <xsl:template match="/databasebaks">
            </xsl:template>
            --处理databasebaks节点下的数据
            <xsl:for-each select="databasebak">
            </xsl:for-each>
            --循环处理databasebak节点下的数据
            <xsl:value-of select="position()"/>  --得到该节点(databasebak)的序号
            <xsl:value-of select="bakname"/>  --得到内容(bakname)

        5   funcxml.asp:
            FormatXml(strXmlFile, strXslFile)  --格式化XML文件,进行对xml和xsl文件进行load操作。返回必要的异常
            LoadXmlDoc(objXml, strLoad, blnIsStr, ByRef strErr)  --Load XML 文件

        6   clsDataBase.asp:  --基本操作类(相当于.net下的Model层与操作层)
            定义:
            Private m_intId               ' Id,对应databasebak节点在databasebaks集合中的位置
            Private m_bakname             ' 名称
            Private m_baktime             ' 时间
            Private m_bakip               ' ip
            Private m_strError            ' 出错信息
            类初始化:
            Private Sub Class_Initialize()
                m_strError = ""
                m_intId = -1
            End Sub
            类释放:
            Private Sub Class_Terminate()
                m_strError = ""
            End Sub
            读写各个属性:
            Public Property Get Id
                Id = m_intId
            End Property
     
            Public Property Let Id(intId)
                m_intId = intId
            End Property
     
            Public Property Get bakname
                bakname = m_bakname
            End Property
     
            Public Property Let bakname(strName)
                m_bakname = strName
            End Property
     
            Public Property Get baktime
                baktime = m_baktime
            End Property
     
            Public Property Let baktime(strBaktime)
                m_baktime = strBaktime
            End Property
     
            Public Property Get bakip
                bakip = m_bakip
            End Property
     
            Public Property Let bakip(strBakip)
                m_bakip = strBakip
            End Property
            获取错误信息:
            Public Function GetLastError()
                GetLastError = m_strError
            End Function
            --有时提示类型不匹配,暂没有用此函数
            私有方法,添加错误信息:
            Private Sub AddErr(strEcho)
                m_strError = m_strError + "<Div CLASS=""alert"">" & strEcho & "</Div>"
            End Sub
            --暂没有用此函数
            清除错误信息:
            Public Function ClearError()
                m_strError = ""
            End Function
            添加信息到XML文件:
            Public Function AddToXml(objXmlDoc)
                Dim objDataBase, objNode
       
                ClearError
       
                If objXmlDoc Is Nothing Then 
                    AddToXml = False
                    AddErr "Dom对象为空值"
                    Exit Function
                End If
       
                ' 创建databasebak节点
                Set objDataBase = objXmlDoc.createElement("databasebak")
                objXmlDoc.documentElement.appendChild objDataBase
       
                ' 创建各个子节点
                '-----------------------------------------------------
                Set objNode = objXmlDoc.createElement("bakname") 
                objNode.Text = m_bakname
                objDataBase.appendChild objNode
       
                Set objNode = objXmlDoc.createElement("baktime")
                objNode.Text = m_baktime
                objDataBase.appendChild objNode
       
                Set objNode = objXmlDoc.createElement("bakip")
                objNode.Text = m_bakip
                objDataBase.appendChild objNode
       
                '-----------------------------------------------------
       
                Set objNode = Nothing
                Set objDataBase = Nothing
       
       
                On Error Resume Next
                objXmlDoc.save Server.MapPath("databasebakinfo.xml")          '保存XML文件
     
                If Err.Number = 0 Then
                    AddToXml = True
      
                Else
     
                    AddToXml = False
                    AddErr Err.Description
                End If
            End Function
           
            从XML文件中删除数据:(需要首先设置Id)
            Public Function DeleteFromXml(objXmlDoc)
                Dim objNodeList, objNode
       
                ClearError
       
                If objXmlDoc Is Nothing Then
                    DeleteFromXml = False
                    AddErr "Dom对象为空值"
                    Exit Function
                End If
       
                If CStr(m_intId) = "-1" Then
                    DeleteFromXml = False
                    AddErr "未正确设置联系人对象的ID属性"
                    Exit Function
                End If
       
                Set objNodeList = objXmlDoc.getElementsByTagName("databasebak")   
                If objNodeList.length - m_intId < 0 Then
                    DeleteFromXml = False
                    AddErr "未找到相应的联系人"
                    Set objNodeList = Nothing
                    Exit Function
                End If
       
                On Error Resume Next
                Set objNode = objXmlDoc.documentElement.removeChild(objNodeList(id-1))
                If objNode Is Nothing Then
                    DeleteFromXml = False
                    AddErr "删除联系人失败"
                    Set objNodeList = Nothing
                    Exit Function
                Else
                    objXmlDoc.save Server.MapPath("databasebakinfo.xml")
                End If
                Set objNode = Nothing
                Set objNodeList = Nothing
       
                If Err.Number = 0 Then
                    DeleteFromXml = True
                Else
                    DeleteFromXml = False
                    AddErr Err.Description
                End If
            End Function
            --获得与修改函数不列出
       
        7   conn.asp:
            dim strConn,objConn
     strConn = "Driver={SQL Server};server=(local);uid=sa;pwd=sa;database=master;"
     set objConn = Server.CreateObject("ADODB.Connection")
     objConn.open strConn
     objConn.CursorLocation = 3

        8   add.asp:
            Dim objXml, objDataBase
     Dim strErr
     
     Set objXml = Server.CreateObject("MSXML2.DOMDocument")
     Set objDataBase = New Cls_DataBase          ' 生成Cls_DataBase对象
     
     If LoadXmlDoc(objXml, "databasebakinfo.xml", False, strErr) Then          ' 装载XML文件
         ' 给相应的属性赋值
         objDataBase.bakname = Request.Form("TxtBakName")
         objDataBase.baktime = date + time
         objDataBase.bakip = request.servervariables("remote_addr")
         If Not objDataBase.AddToXml(objXml) Then          ' 调用Cls_DataBase类的AddToXml方法,添加数据
             'AddErr strErr, objDataBase.GetLastError  --取消此错误提示
         else
      'AddErr strErr, "添加成功"
      --备份操作:
                    dim rs02
      set rs02 = server.CreateObject("adodb.recordset")
      rs02.open "backup database "+ request.Form("SelDataBase") +" to disk ='d:\"+request.Form("TxtBakName")+".bak'",objConn,3,3
       
      set rs02=nothing
       
      response.Write("<script>alert('添加成功!')</script>")  --不知道为什么不显示,不知道被哪句影响了
      response.Redirect("index.asp")
         end if
     end if
     
     Set objXml = Nothing

        8   del.asp:
            Dim objXml, objDataBase, id
     Dim strErr
     id = request.QueryString("id")
      
     Set objXml = Server.CreateObject("MSXML2.DOMDocument")
     Set objDataBase = New Cls_DataBase          ' 生成Cls_DataBase对象
     
     If LoadXmlDoc(objXml, "databasebakinfo.xml", False, strErr) Then
         objDataBase.Id = id
         If Not objDataBase.DeleteFromXml(objXml) Then
       
         else
      response.Write id
      response.Write("<script language=javascript>this.location.href='index.asp';</script>")  --用location.href可以在返回时刷新页面
         end if  
     end if
     
     set objXml = nothing

        9   download.asp:
            Const USE_STREAM = 0 '0.不用流(Adodb.Stream)下载 1.用流下载
     Const ALLOW_FILE_EXT = "rar,zip,chm,doc,xls,swf,mp3,gif,jpg,jpeg,png,bmp,bak" '允许下载的文件的扩展名,防止源代码被下载
     
     Dim sDownFilePath '下载文件路径
     sDownFilePath = request.QueryString("id") + ".bak" '如果 sDownFilePath 为绝对路径,一定要将 sDownFilePath 转换为相对 本文件的相对路径
     
     Call DownloadFile(sDownFilePath)
     
     function DownloadFile(s_DownFilePath)
         '判断有没传递文件名
         If IsNull(s_DownFilePath) = True Or Trim(s_DownFilePath) = "" Then
      OutputErr "错误:先确定要下载的文件,下载失败"
         end if
      
     '判断扩展名是否合法
     Dim s_FileExt
     s_FileExt = Mid(s_DownFilePath, InstrRev(s_DownFilePath, ".")+1)
     If InStr("," & ALLOW_FILE_EXT & ",", "," & s_FileExt & ",") <= 0 Then
         OutputErr "错误:文件类型(" & s_FileExt & ")不允许被下载,下载失败"
     end if
      
     s_DownFilePath = Replace(s_DownFilePath, "", "/")
      
     '检测服务器是否支持fso
     Dim o_Fso
     On Error Resume Next
     Set o_Fso = Server.CreateObject("Scripting.FileSystemObject")
     If Err.Number <> 0 Then
         Err.Clear
         OutputErr "错误:服务器不支持fso组件,下载失败"
     end if
      
     '取得文件名,文件大小
     Dim s_FileMapPath
     Dim o_File, s_FileName, n_FileLength
     s_FileMapPath = Server.MapPath(s_DownFilePath)
     If (o_Fso.FileExists(s_FileMapPath)) = True Then
         Set o_File = o_Fso.GetFile(s_FileMapPath)
         s_FileName = o_File.Name
         n_FileLength = o_File.Size
         o_File.Close
     else
         OutputErr "错误:文件不存在,下载失败"
     end if
     Set o_Fso = Nothing
      
     '如果不是用流下载,直接转到该文件
     If USE_STREAM = 0 Then
         Response.Redirect sDownFilePath
         response.End()
     end if
      
     '检测服务器是否支持Adodb.Stream
     On Error Resume Next
     Set o_Stream = Server.CreateObject("Adodb.Stream")
         If Err.Number <> 0 Then
                Err.Clear
                OutputErr "错误:服务器不支持Adodb.Stream组件,下载失败"
         End If

         o_Stream.Tyep = 1
         o_Stream.Open
         o_Stream.LoadFromFile s_FileMapPath

     Response.Buffer = True
         Response.Clear
         Response.AddHeader "Content-Disposition", "attachment; filename=" & s_FileName
         Response.AddHeader "Content-Length", n_FileLength
         Response.CharSet = "UTF-8"
         Response.ContentType = "application/octet-stream"
         Response.BinaryWrite o_Stream.Read
     Response.Flush

         o_Stream.Close
         Set o_Stream = Nothing

     End Function

     Sub OutputErr(s_ErrMsg)
         Response.Write "<font color=red>" & s_ErrMsg & "</font>"
         Response.End
     End Sub


            对于删除部分,有时运行时删除失效,要重新进入该网站才可以,我还不知道为什么。

  • 相关阅读:
    java 键盘监听事件
    DOM扩展
    DOM
    CSS hack
    客户端检测
    BOM
    函数表达式
    面向对象的程序设计
    引用类型(下)
    引用类型(上)
  • 原文地址:https://www.cnblogs.com/liangyi/p/1046510.html
Copyright © 2011-2022 走看看