sql – ADO Recordset数据没有显示在表单上

我在MS Access 2010中遇到一个令人沮丧的问题,我将在这个阶段被认定为一个错误.在尝试了所有可能的解决方法之后,我没有想法,依靠你.

上下文

超大容量的Access 2010应用程序,25k行VBA和> 50个表单.它具有客户端服务器架构,前端编译和网络上的Access后端.它连接到不同数据库(Oracle / sql Server / Sybase IQ)的二十分之一.

问题

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

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

它可以在几个月内完美的工作,突然间,一个形式将开始有这个问题没有任何明显的原因(即使在我没有改变的表单上也可能会发生).当它发生时,它对所有用户都是这样,所以这在前端accdb / accde中真的是错误的.

该问题与特定的DBMS / Driver无关. 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

使用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,"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",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

我试过的事情到目前为止

对于记录集,我尝试了所有可能的变体

.LockType = adLockpessimistic
            .CursorType = adUseClient
            .CursorLocation = adUseClient

处理记录集的子表单都具有快照记录集类型,如果我尝试dynaset,问题依然存在.
Dataentry,添加,删除,编辑都被禁用.它是纯只读的.

我有一个习惯,使用RST.ActiveConnection = nothing断开记录集,所以我可以操纵它们,但这也不会影响问题.

它可能发生在非常简单的查询,只有一个字段在SELECT子句中,只有一个字段绑定到一个子窗体.

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

random_answer_guy提出的解决方案乍一看,它认证了bug假说.不幸的是,我的问题在主要形式的一些(完全无关))变化后重新出现.我回到没有显示数据的4或5个子表单,添加/删除所有或部分的Load事件不再有任何区别

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

总结一下

什么是非常令人沮丧的是,我可以有两个不同的形式与完全相同的属性和相同的字段,相同的sql指令在相同的数据库,相同的记录集管理代码一个显示数据,而另一个不!

当问题发生时,我没有别的选择,而不是删除所有操作的对象,并从旧版本重新导入,或者从头开始重新创建它们.

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

有没有人经历过这个问题,并提出解释和/或解决方法

解决方法

我以前也有同样的问题,只是添加一个空白的Form_Load事件来解决问题.没有代码需要与Form_Load它只需要存在.

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 &#39;EastRiver&#39; 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...