如何通过API无延迟地将高容量,高速率的流记录处理到ms访问表中

时间:2014-11-10 21:33:30

标签: vba ms-access access-vba

我正在使用第三方ActiveX API将记录流式传输到访问表中。在8小时的时间内,我收到了超过10万条记录。它是突发性的,有时我每秒钟收到一条记录,有时我每秒收到很多记录。

我需要对记录应用过滤器和条件,并立即(尽快)显示符合条件的记录。平均每天可能会有10到20条记录。

据我所知,访问权限不支持多线程(我对该主题的知识不存在)。

到目前为止我的经历: 在不应用过滤器/条件的情况下将数据流式传输到表中;它没有延迟。 但是,当我开始动态应用过滤器/条件时,我的流开始延迟。

因此我将流式API保存在一个子目录中。然后创建一个新表单,并使用Timer设置为1秒。

在子Form_Timer中我有代码打开表,查找自上次运行以来的新记录,应用过滤器/条件并显示过滤掉的记录。 由于Form的Timer设置为1秒,并且过滤是从另一个form / sub完成的,我的想法是,流入表中的流可以不间断地进行。在同一时间(在1秒循环中)我有其他代码进行过滤。

然而,它仍然开始延迟流数据。

那么我如何在Access中执行此操作?还是我完全吠叫错了树?我只有一些使用Access的经验,因此我可以选择使用。

我是否可以使用第二个数据库并使用链接表?这样过滤就真正地与流媒体分开了。这会造成任何延迟吗? 如果在Access中无法完成此类任务,我应该使用什么? MY-SQL?任何想法?

感谢您的回复。

这是我正在尝试的代码:

以下代码在我的主表单上;如果我点击“订阅”按钮,记录流开始,只要它是在上午9:30到下午4点之间: TDAComm1是第三方ActiveX API。

Public Sub Subscribe_Click()
Set db = CurrentDb
Set rsCS = db.OpenRecordset("OptionStream", dbOpenDynaset)
L = TDAComm1.Subscribe(TList, TxTDASubTypes.TDAPI_SUB_L1)
End Sub
Private Sub TDAComm1_OnL1Quote(ByVal Quote As Object)
With rsCS
.AddNew
!Symbol = Quote.Symbol
!Bid = Quote.Bid
!Ask = Quote.Ask
!Last = Quote.Last
!High = Quote.High
!Low = Quote.Low.Update
End With
TradeCounter = TradeCounter + 1
End Sub

(大约35个字段,我没有在这里发布) 然后,附加到另一个表单我使用以下代码打开optionStream表作为快照,并使用Form_Timer(设置为1秒)将过滤器应用于最后一秒添加的记录。

Private Sub Form_Timer()
Dim ToD As Date
ToD = TimeValue(Now)
If ToD >= TimeValue("09:30:00 AM") And ToD <= TimeValue("16:30:00 PM") Then
    Me.MH = True
    If LookForTradesFinished = True Then
        LookForTrades
    End If
Else
    Me.MH = False
End If
End Sub

Public Sub LookForTrades()

If TradeCounter > TotalTrades Then
    Dim Tradecntr As Integer
    Tradecntr = TradeCounter
    LookForTradesFinished = False
    Dim Newtrade As Double
    Dim T As Integer
    Dim Y As Integer
    Dim TN As Integer
    Me.LookTrades = False
    Me.Tradecount = Tradecntr
    Me.Trads = TotalTrades

        Newtrade = Tradecntr - TotalTrades

        Me.Newtr = Newtrade

Set rsOS = db.OpenRecordset("OptionStream", dbOpenSnapshot)

With rsOS
.MoveLast
V = 0
If Newtrade > 1 Then
    For U = 1 To (Newtrade - 1)
        .MovePrevious
        V = U
        If .BOF Then
            Exit For
        End If
    Next
Else
    V = 1
End If

For U = 1 To V

If !Trade = "Ask" Or !Trade = "Above Ask" Then
    If !TradeVolume <= !OpenInterest Then
        strstatus = Chr(36) & !Symbol & " " & "Qty " & !TradeVolume & " at " & !Last & " " &     !Trade & " " & Chr(36) & " " &  _                                              
        !TradeAmount & " " & "Vol " & !Volume & " " & "OI " & !OpenInterest & " " & "TimeOfTrade     " & !TradeTimeCalc
    Else
        strstatus = Chr(36) & !Symbol & " " & "Qty " & !TradeVolume & " at " & !Last & " " &     !Trade & " " & Chr(36) & " " &_ 
        !TradeAmount & " " & "Vol " & !Volume & " " & "OI " & !OpenInterest & " " & "QTY" &     Chr(62) & "OI" & " " & "TimeOfTrade
         " & !TradeTimeCalc
    End If


If !CallPut = "C" Then
    For T = 0 To 3
        ShwCtrades(T) = ShwCtrades(T + 1)
        Me.Controls("SPYC" & T) = ShwCtrades(T)
    Next
    ShwCtrades(4) = strstatus
    Me.Controls("SPYC" & 4) = strstatus
Else
    For T = 0 To 3
        ShwPtrades(T) = ShwPtrades(T + 1)
        Me.Controls("SPYP" & T) = ShwPtrades(T)
    Next
        ShwPtrades(4) = strstatus
        Me.Controls("SPYP" & 4) = strstatus
End If
End If
.MoveNext
    If .EOF Then
        Exit For
    End If
Next
End With
rsOS.Close
End If
Me.LookTrades = True
LookForTradesFinished = True

End Sub

所以我不清楚以下内容:

当LookForTrades子进入表格并对新记录应用过滤器,并且只在我的表单上显示那些新记录时,我的主表单上的子句可以继续同时流入表格吗? 或者是在LookForTrades子项完成之前停止了吗?如果是这种情况,它可以解释为什么有时我的流媒体开始延迟。

延迟我的意思是: 每条记录都有自己的时间戳。我将此时间戳与当前时间进行比较,通常不会有超过1或2秒的差异。但是当它开始延迟时,我看到记录的时间戳和当前时间之间的差异越来越大。 这让我相信Access无法跟上流。 因此,我的问题是Access是否可以执行如上所述的“多任务处理”。

0 个答案:

没有答案