在MS Access中显示HTTP请求的进度

时间:2016-02-24 07:05:23

标签: vba ms-access access-vba xmlhttprequest

我使用以下代码,从API获取数据并将数据添加到表中。我想向用户显示API Request Made的进度。因此,使用If来使用readyState Property (IXMLHTTPRequest)

获取请求的状态

问题 -

调用此函数时,我只得到一个带有4的msgbox。 我错过了什么?

Option Compare Database

Dim ApiUrl As String
Dim reader As New XMLHTTP60
Dim coll As Collection
Dim Json As New clsJSONParser

Public Sub ApiInitalisation()
    ApiUrl = "http://private-anon-73376961e-countingappapi.apiary-mock.com/"
End Sub

Public Sub GetPerson()
On Error GoTo cmdLogIn_Click_Err

    'For API
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Dim contact As Variant

    Api.ApiInitalisation
    ApiUrl = ApiUrl & "users/5428a72c86abcdee98b7e359"

    reader.Open "GET", ApiUrl, False
    'reader.setRequestHeader "Accept", "application/json"
    reader.send

    'Temporay variable to store the response
    Dim egTran As String

相关代码开始

    If reader.ReadyState = 0 Then
    MsgBox (0)
    End If

    If reader.ReadyState = 1 Then
    MsgBox (1)
    End If

    If reader.ReadyState = 2 Then
    MsgBox (2)
    End If

    If reader.ReadyState = 3 Then
    MsgBox (3)
    End If

    If reader.ReadyState = 4 Then
    MsgBox (4)
    End If


    '-------------
    ' Why is this code required?
    ' Not yet found answer

    'Do Until reader.ReadyState = 4
    '   DoEvents
    'Loop
    '-------------------

相关代码结束

    ' Add data to Table
    If reader.Status = 200 Then
        Set db = CurrentDb
        Set rs = db.OpenRecordset("tblPerson", dbOpenDynaset, dbSeeChanges)

        egTran = "[" & reader.responseText & "]"
        Set coll = Json.parse(egTran)

        For Each contact In coll
            rs.AddNew
            rs!FName = contact.Item("name")
            rs!Mobile = contact.Item("phoneNumber")
            rs!UserID = contact.Item("deviceId")
            rs!SID = contact.Item("_id")
            rs.Update
        Next

    Else
        MsgBox "Unable to import data."
    End If

End Sub

根据Microsoft documentation

0(UNINITIALIZED)=

该对象已创建,但尚未初始化(尚未调用open方法)。

(1)LOADING =

已创建对象,但尚未调用send方法。

(2)LOADED =

已调用send方法,但状态和标头尚未可用。

(3)INTERACTIVE =

已收到一些数据。在此状态下调用responseBody和responseText属性以获取部分结果将返回错误,因为状态和响应标头不完全可用。

(4)COMPLETED =

已收到所有数据,并且responseBody和responseText属性中提供了完整的数据。

1 个答案:

答案 0 :(得分:0)

除非你遗漏了一些代码或者我误解了,否则你已经在使用reader.send 之前来检查ReadyState。它总是会以完成状态返回,除非遇到致命错误(即便如此,它可能会以完成状态返回)。