Access911.net   |   a9BBS   |   OTaA System  
  搜索文章:  
Access911欢迎您光临  
   主页      上传      繁體版       论坛     
设为首页  |  加入收藏   
  
你现在的位置:文章索引 -> 文章分类 -> 发布  
 首页|  近日更新|  下载  |  文章索引  |  搜索|  术语|  承接工程|  
 
系统正在加载内容,请耐心等待...
 
 查询
 窗体
 报表
 
 
 VBA
 函数
 ADO/DAO/ADO.NET
 API
 ADP
 安全
 发布
 OA
 ASP/ASP.NET
 其他语言
 控件
 DELPHI
 C#/.Net
 本站
 其他
 小例程
 常用软件
 参考文档
 业主作品
 网友大作
 
 
友情链接
 access911.net
 
访问人次
 1702218
 
站长 E-Mail
 net911@sina.com
 access911@gmail.com
 
RSS 订阅

显示附加信息 >>>

如何可以使ACCESS数据库自动上网升级?(一)如何下载网站上的文件

作者:cg1  摘自:access911.net  :cg1  更新日期:2004-7-29  浏览人次:

 

问题:

如何可以使ACCESS数据库自动上网升级?
我想增加类似NORTON的自动更新功能,ACCESS 的 MDB 格式数据库能达到要求么?
比如我的更新信息放在 http://access911.net/eg/newpack.txt 中,如何读取分析,并下载位于其他目录的更新包?
下载后如何解压缩,如何更新现在正在使用的程序?

 

回答:

(一)
本次先解决如何检测更新信息并下载压缩包:
思路如下:
    我们要做的是,先创建一个固定格式的文本文件(当然,你也可以用其他任何格式),用于存储更新包的信息,比如更新包的最后更新日期、版本、文件位置、文件数量、文件大小等等信息,而这个文件可以上传到 WEB 站点,任何人都可以访问这个文件。然后我们通过特定程序读取并分析这个文本文件,核对本地硬盘上的数据库是否是最新的,如果“是”,就下载,如果“不是”就取消下载(这里还可以做一个提醒用户的选项,让用户自己选择在有新版本软件时是否下载)

实际操作代码如下:
    将下列代码COPY 到一个新建的"模块"中
Function test1()
'本过程用于调用下列两个过程,实现在线分析并下载更新包
    CheckNewVersion 500
End Function

Public Function DownloadPack(ByVal strURL As String, ByVal strFileName As String) As Boolean
'本函数用于下载更新包
请引用 ADO 2.5 以上版本

    Dim objStream As New Stream
    Dim strLocalDir As String
    strLocalDir = "Temp"     '用于临时存储更新包的目录名
    If Dir(CurrentProject.Path & "\" & strLocalDir, vbDirectory) = "" Then
        MkDir CurrentProject.Path & "\" & strLocalDir
    End If
    
    With objStream
        .Mode = adModeRead
        .Type = adTypeBinary
        objStream.Open "URL=" & strURL & strFileName
        If Dir(CurrentProject.Path & "\" & strLocalDir & "\" & strFileName) <> "" Then
            '检测是否已经存在该文件,如果存在则删除
                   '本语句可以使用 .SaveToFile 的一个参数adSaveCreateOverWrite 代替
                   '但是为了考虑要用户确认是否删除,在这里仍然附加一个判断
                   '你可以按自己要求决定

            Kill CurrentProject.Path & "\" & strLocalDir & "\" & strFileName
        End If
        .SaveToFile CurrentProject.Path & "\" & strLocalDir & "\" & strFileName
        DoEvents
    End With
End Function

Function CheckNewVersion(ByVal lngCurrentVersion As Long) As String
'本函数用于检测位于 WEB 服务器上的更新信息文件
'下面示例中 http://access911.net/down/eg/newsoft.txt 这个文件中存储着最新的软件更新的信息
'该文本内容如下:

'[更新信息]
'5155
'2004-1-1
'http://access911.net/down/eg/
'combox_eg_alex.rar
'215621
'
'[说明]
'版本号
'更新日期
'文件位置
'文件名
'文件大小

    Dim objStream As New Stream
    Dim i As Long
    Dim strA(6) As String
    'strA(1)为 版本号
    'strA(2)为 更新日期
    'strA(3)为 文件路径
    'strA(4)为 文件名
    'strA(5)为 文件大小
    'strA(6)为 更新说明

    
    With objStream
        .Mode = adModeRead
        .Type = adTypeText
        .Charset = "GB2312"
        .Open "URL=http://access911.net/down/eg/newsoft.txt"
        '20060602 经网友提问,上述语句会造成错误:
        '运行时错误 '-1073446902 (c004800a)'
        '上述错误目前在 Access2003 \ windows2003 \ windos xp 的环境中已经出现
        '初步判断为微软对 http 域外的文件增加了权限限制 (KB870669)

        For i = 0 To 6
            strA(i) = .ReadText(adReadLine)
            Debug.Print strA(i)
        Next
        
        If CLng(strA(1)) > lngCurrentVersion Then
            DownloadPack strA(3), strA(4)
        End If
    End With
End Function


有时候由于一个网站软件版本以及品种较多,可能会使用数据库来管理对应的信息文件,这样,我们可以直接撰写 ASP 动态页面来发布更新信息。但是直接使用 STREAM 对象来读取 ASP 网页会产生错误。这里就需要引入一个新的对象 XMLHTTP。示例代码如下:

Function ReadFromAspFile()
'本函数用于下载某个动态网页
'请先引用 Microsoft XML, v3.0

    Dim objXMLHttp  As New XMLHTTP
    Dim objStream As New ADODB.Stream
    Dim strURL As String
    Dim strFilePathAndName As String
    
    '读取的路径
    strURL = "http://access911.net/index.asp"
    '保存为本地硬盘某个文件
    strFilePathAndName = "c:\temp\index.html"
    
    '读取数据
    objXMLHttp.Open "GET", "http://access911.net/index.asp", False
    objXMLHttp.Send
    objStream.Type = adTypeBinary
    objStream.Open
    objStream.Write objXMLHttp.Responsebody
    '保存为本地文件
    objStream.SaveToFile "c:\temp\index.asp", adSaveCreateOverWrite
    '当然拉,你也可以使用前面读取TXT 文件相同的方法
    '用 .ReadText(adReadLine) 来分析文件

    objStream.Close
End Function


既然上面讲到了 XML ,我们也可以将存放更新信息的 newsoft.txt 更改为结构更加清晰明了的 XML 格式,且 ACCESS.APPLICATION 本身就有一个方法 ImportXML 可以直接从网页上获取 XML 信息,这样更通用。
http://access911.net/down/eg/newsoft.xml 的源代码如下:
<?xml version="1.0" encoding="utf-8" ?> 
<UpdatePackage>
<VersionNumber>5155</VersionNumber>
<UpdateDate>2004-1-1</UpdateDate>
<FilePath>http://access911.net/down/eg/</FilePath>
<FileName>combox_eg_alex.rar</FileName>
<FileSize>215621</FileSize>
</UpdatePackage>


如果你不清楚 XML 文档的格式,在 ACCESS 2003 中可以将一个表导出为 XML 文件格式,然后用 NOTEPAD.EXE 直接查看其源代码。

获取更新包的代码更改为以下方法:

Function test1()
'本过程用于调用下列两个过程,实现在线分析并下载更新包
    CheckNewVersion 500
End Function

Function CheckNewVersion(ByVal lngCurrentVersion As Long)
On Error GoTo ErrMessage
    
    Application.ImportXML _
        DataSource:="http://access911.net/down/eg/newsoft.xml", _
        ImportOptions:=acAppendData

    Dim strMaxVersionNumber As String
    Dim strFilePath As String
    Dim strFileName As String
    '以下用 DMAX 函数获取 VersionNumber 最大的那行记录
    strMaxVersionNumber = Dmax("VersionNumber", "UpdatePackage")
    strFilePath = DLookup("FilePath", "UpdatePackage", "VersionNumber='" & strMaxVersionNumber & "'")
    strFileName = DLookup("FileName", "UpdatePackage", "VersionNumber='" & strMaxVersionNumber & "'")
    
    If CLng(strMaxVersionNumber) > lngCurrentVersion Then
        DownloadPack strFilePath, strFileName
    End If
    
ExitFun:
    Exit Function

ErrMessage:
    If Err <> 0 Then
        MsgBox "不能正确分析更新包,可能是网络不通或者更新文件有问题。" & vbCrLf & _
                "你可以将以下资料反馈给开发者:" & vbCrLf & vbCrLf & _
                "问题号:" & Err.Number & vbCrLf & _
                "问题描述:" & Err.Description
    End If
    GoTo ExitFun
    
End Function

Public Function DownloadPack(ByVal strURL As String, ByVal strFileName As String) As Boolean
'本函数用于下载更新包
'请引用 ADO 2.5 以上版本

    Dim objStream As New Stream
    Dim strLocalDir As String
    strLocalDir = "Temp"     '用于临时存储更新包的目录名
    If Dir(CurrentProject.Path & "\" & strLocalDir, vbDirectory) = "" Then
        MkDir CurrentProject.Path & "\" & strLocalDir
    End If
    
    With objStream
        .Mode = adModeRead
        .Type = adTypeBinary
        objStream.Open "URL=" & strURL & strFileName
        If Dir(CurrentProject.Path & "\" & strLocalDir & "\" & strFileName) <> "" Then
            '检测是否已经存在该文件,如果存在则删除
                   '本语句可以使用 .SaveToFile 的一个参数adSaveCreateOverWrite 代替
                   '但是为了考虑要用户确认是否删除,在这里仍然附加一个判断
                   '你可以按自己要求决定

            Kill CurrentProject.Path & "\" & strLocalDir & "\" & strFileName
        End If
        .SaveToFile CurrentProject.Path & "\" & strLocalDir & "\" & strFileName
        DoEvents
    End With
End Function


关于  XMLHTTP 的相关参考请参考 Microsoft XML 4.0 SDK

未完,待续...

本站文章旨在为该问题提供解决思路及关键性代码,并不能完成应该由网友自己完成的所有工作,请网友在仔细看文章并理解思路的基础上举一反三、灵活运用。

access911.net 原创文章,作者本人对文章保留一切权利。
如需转载必须征得作者同意并注明本站链接

 


Question:

How to update the ACCESS database automaticly by the internet? 
Can I add an function like the LiveUpdate of NORTON using MDB ACCESS database? 
For example, I put the update-information at 'http://access911.net/eg/newpack.txt'. Then how to get these information and  make it automaticly downloading the update-packages from other website? 


Answer:

First, we need to know how to check the update-information and download the update-packages.
All we need to do is to setup a fixed-format text file(of course,you can use any file format you like) with the update- information such as the last date of updating, editions,files path,the quantity of the files,file size,and so on. This file should be uploaded to the website so that anybody can access it. Then a specified program will read  this file and check the database in harddisk whether it is the newest edition or not. Give up download for 'YES', download  for 'NO'. And there is an option for the user to choose whether download or not.

coding as follows:
Function test1()
'To load function CheckNewVersion to check the update-information and download the update-packages online.
    CheckNewVersion 500
End Function 

Public Function DownloadPack(ByVal strURL As String, ByVal strFileName As String) As Boolean
'To download the update-package, please reference ADO 2.5.
    Dim objStream As New Stream
    Dim strLocalDir As String
    Dim strCPath As String
    strCPath = CurrentProject.Path
    strLocalDir = "Temp"     'To keep the path of the update-package temporarily
    If Dir(strCPath & "\" & strLocalDir, vbDirectory) = "" Then
        MkDir strCPath & "\" & strLocalDir
    End If
    
    With objStream
        .Mode = adModeRead
        .Type = adTypeBinary
        objStream.Open "URL=" & strURL & strFileName
        If Dir(strCPath & "\" & strLocalDir & "\" & strFileName) <> "" Then
            'to check the file name. If there already has one file with the same name,then delete it.
                   'This sentence can be replaced with the adSaveCreateOverWrite of .SaveToFile
            Kill strCPath & "\" & strLocalDir & "\" & strFileName
        End If
        .SaveToFile strCPath & "\" & strLocalDir & "\" & strFileName
        DoEvents
    End With
End Function

Function CheckNewVersion(ByVal lngCurrentVersion As Long) As String
'To check the update-information file on the website.
    Dim objStream As New Stream
    Dim i As Long
    Dim strA(6) As String
    With objStream
        .Mode = adModeRead
        .Type = adTypeText
        .Charset = "GB2312"
        .Open "URL=http://access911.net/down/eg/newsoft.txt"
        For i = 0 To 6
            strA(i) = .ReadText(adReadLine)
            Debug.Print strA(i)
        Next
        If CLng(strA(1)) > lngCurrentVersion Then
            DownloadPack strA(3), strA(4)
        End If
    End With
End Function

The content of http://access911.net/down/eg/newsoft.txt as follows:
[update-information]
5155
2004-1-1
http://access911.net/down/eg/
combox_eg_alex.rar
215621

[explain]
Version Number
the date of update
the website of the update-package file
file name
file size


We can also change the newsoft.txt into XML format so that the structure will be more understandable. Furthermore, the method  'ImportXML' of ACCESS can get XML from the web page.
The code of http://access911.net/down/eg/newsoft.xml as follows:
<?xml version="1.0" encoding="utf-8" ?> 
<UpdatePackage>
<VersionNumber>5155</VersionNumber>
<UpdateDate>2004-1-1</UpdateDate>
<FilePath>http://access911.net/down/eg/</FilePath>
<FileName>combox_eg_alex.rar</FileName>
<FileSize>215621</FileSize>
</UpdatePackage> 

To get the update-information:
Function CheckNewVersion(ByVal lngCurrentVersion As Long)
On Error GoTo ErrMessage
    Application.ImportXML _
        DataSource:="http://access911.net/down/eg/newsoft.xml", _
        ImportOptions:=acAppendData
    Dim strMaxVersionNumber As String
    Dim strFilePath As String
    Dim strFileName As String
    'To use DMAX to get the record with last VersionNumber
    strMaxVersionNumber = Dmax("VersionNumber", "UpdatePackage")
    strFilePath = DLookup("FilePath", "UpdatePackage", "VersionNumber='" & strMaxVersionNumber & "'")
    strFileName = DLookup("FileName", "UpdatePackage", "VersionNumber='" & strMaxVersionNumber & "'")
    If CLng(strMaxVersionNumber) > lngCurrentVersion Then
        DownloadPack strFilePath, strFileName
    End If
ExitFun:
    Exit Function
ErrMessage:
    If Err <> 0 Then
        MsgBox "Can not read the update-package, or there is some problem with the network or the update file." &  vbCrLf & _
                "Please feedback to the Administrator:" & vbCrLf & vbCrLf & _
                "Problem NO.:" & Err.Number & vbCrLf & _
                "Problem description:" & Err.Description
    End If
    GoTo ExitFun
End Function

Please refer to  the  Microsoft XML 4.0 SDK about the XMLHTTP.

 


 

 
相关文章
     没有手动相关文章
 
评论
     查看或发表更多的评论,请单击这里。
 
 
 
 
 
   
  Access911.net   |   a9BBS   |   OTaA System   |
建站日期:2000年4月2日  |  设计施工:陈格 ( access911 & cg1 )
 Copyright © 2000 - 2003 COMET, 陈格 保留所有权利