ADO Recordset数据未在表单中显示

Tho*_*s G 9 sql ms-access vba ado ms-access-2010

我在MS Access 2010上遇到了令人沮丧的问题,我现在在这个问题上有资格作为一个bug.在尝试了所有可能的解决方法之后,我没有想法并且依赖于你.


上下文

巨大的Access Access 2010应用程序,具有25k行VBA和> 50个表单.它有一个客户端服务器体系结构,其前端已编译,网络上有Access后端.它连接到二十几个不同的数据库(Oracle/SQL Server/Sybase IQ).


问题

有时,当我将ADODB记录集分配给子表单时,其数据不会显示在绑定字段中.我#Name?到处都是

数据就在那里.我可以debug.print,我可以在Watches浏览器中看到它,我可以在使用代码循环记录集对象时读取或操作它.它只是没有出现在子表单中.

它可以在几个月内完美地工作,突然一个表格将开始出现这个问题而没有任何明显的原因(即使在我没有改变的表格上也可能发生).当它发生时,它适用于所有用户,所以这在前端accdb/accde中确实是错误的.

该问题与特定的DBMS /驱动程序无关.Oracle或Sybase数据可能会发生这种情况.

我创建了自己的类,抽象出与ADO连接和查询相关的所有内容,并在各处使用相同的技术.基于它,我有十分之几的表格,而且大多数表现都很完美.

我在我的应用程序的几个部分中遇到了这个问题,特别是在具有大量子表单和代码的高度复杂的表单中.在这个主表单上,一些子表单有问题,而其他子表单没有.它们具有完全相同的参数.


代码

这就是我填充表单记录集的方式:

        Set RST = Nothing
        Set RST = New ADODB.Recordset
        Set RST = Oracle_CON.QueryRS(SQL)

        If Not RST Is Nothing Then
            Set RST.ActiveConnection = Nothing
            Set Form_the_form_name.Recordset = RST
        End If
Run Code Online (Sandbox Code Playgroud)

调用的代码Oracle_CON.QueryRS(SQL)

Public Function QueryRS(ByVal SQL As String, Optional strTitle As String) As ADODB.Recordset

    Dim dbQuery As ADODB.Command
    Dim Output As ADODB.Recordset
    Dim dtTemp As Date
    Dim strErrNumber As Long
    Dim strErrDesc As String
    Dim intSeconds As Long

    Dim Param As Variant

    If DBcon.state <> adStateOpen Then
        Set QueryRS = Nothing
    Else
        DoCmd.Hourglass True

        pLastRows = 0
        pLastSQL = SQL
        pLastError = ""
        pLastSeconds = 0

        Set dbQuery = New ADODB.Command
        dbQuery.ActiveConnection = DBcon
        dbQuery.CommandText = SQL
        dbQuery.CommandTimeout = pTimeOut

        Set Output = New ADODB.Recordset

        LogIt SQL, strTitle

        dtTemp = Now

        On Error GoTo Query_Error

        With Output
            .LockType = adLockPessimistic
            .CursorType = adUseClient
            .CursorLocation = adUseClient
            .Open dbQuery
        End With

        intSeconds = DateDiff("s", dtTemp, Now)

        If Output.EOF Then
            LogIt "-- " & Format(Now, "hh:nn:ss") & " | Executed in " & intSeconds & " second" & IIf(intSeconds = 1, "", "s") & " | Now rows returned."
            Set QueryRS = Nothing
        Else
            Output.MoveLast
            pLastRows = Output.RecordCount
            LogIt "-- " & Format(Now, "hh:nn:ss") & " | Executed in " & intSeconds & " second" & IIf(intSeconds = 1, "", "s") & " | " & Output.RecordCount & " row" & IIf(Output.RecordCount = 1, "", "s") & " returned."
            Output.MoveFirst
            Set QueryRS = Output
        End If

    End If

Exit_Sub:
    pLastSeconds = intSeconds
    Set Output = Nothing
    Set Parameter = Nothing
    Set dbQuery = Nothing

    DoCmd.Hourglass False

    Exit Function

Query_Error:

    intSeconds = DateDiff("s", dtTemp, Now)

    strErrNumber = Err.Number
    strErrDesc = Err.DESCRIPTION
    pLastError = strErrDesc

    MsgBox strErrDesc, vbCritical, "Error " & pDSN

    LogIt strErrDesc, , "ERROR"

    Set QueryRS = Nothing
    Resume Exit_Sub
    Resume
End Function
Run Code Online (Sandbox Code Playgroud)

到目前为止我尝试过的事情

对于记录集,我尝试了每种可能的变体

            .LockType = adLockPessimistic
            .CursorType = adUseClient
            .CursorLocation = adUseClient
Run Code Online (Sandbox Code Playgroud)

处理记录集的子表单都具有Snapshot记录集类型,如果我尝试,问题仍然存在dynaset.数据条目,添加,删除,编辑均已禁用.它是纯粹的只读.

我习惯断开记录集的使用,RST.ActiveConnection = Nothing以便我可以在之后操作它们,但这也不会影响问题.

它可以在非常简单的查询中发生,在SELECT子句中只有一个字段,并且在子表单上只有一个字段绑定到它.

重新导入新的accdb中的所有对象也不能解决问题.

random_answer_guy提出的解决方案乍一看,它认可了错误假设.不幸的是,在主要形式的一些(完全不相关的)变化之后,我的问题再次出现.我回来了4或5个不显示数据的子表单,并且在全部或部分上添加/删除Load事件不再有任何区别

如果你想了解更多关于这个问题有多奇怪的信息,我建议你阅读我对random_answer_guy回答的评论.


总结一下

非常令人沮丧的是,我可以拥有两个具有完全相同属性和相同字段的不同表单,同一个DB上的相同SQL指令,相同的记录集管理代码:一个显示数据而另一个不显示!

当问题发生时,除了删除所有被操纵的对象并从旧版本重新导入它们或从头开始重新创建它们之外我别无选择.

如果这不是一个错误,我仍然在寻找合适的词来进行限定.

有没有人遇到过这个问题并提出解释和/或解决方法?

小智 7

我以前遇到过同样的问题而只是添加一个空白Form_Load事件解决了这个问题.没有代码需要与Form_Load它只需要存在.