访问/ ODBC错误3146

时间:2013-12-10 20:00:35

标签: sql-server-2008-r2 odbc access-vba ms-access-2010

我有一个MS Access 2007前端到MS SQL Server 2008R2后端。

我有一个查询是循环的一部分,并且当循环迭代时,它突然开始在一个查询上生成Run-time error '3146': ODBC--call failed.错误。奇怪的是,这不是第一次迭代。编辑:当我突然说,它已经运行这么好几个月(可能是从3月开始)。

Set db = CurrentDb
db.QueryTimeout = 480 'thought there was a timeout issue, so set this very high
    Set SupvRS = db.OpenRecordset("SELECT DISTINCT tblProcessors.Supervisor, tblProcessors.SupervisorEmail " & _
        "  FROM tblProcessors INNER JOIN (tblAuditPr INNER JOIN tblAuditPr_A ON tblAuditPr.PrAudit_ID = tblAuditPr_A.PrAudit_ID)" & _
                            " ON tblProcessors.Processor = tblAuditPr_A.Processor" & _
        " WHERE tblProcessors.Supervisor IS NOT NULL " & _
        "   AND tblAuditPr.EndDate BETWEEN " & GetSQLDate(Me.txtFrom) & " AND " & GetSQLDate(Me.txtTo) & _
        "   AND tblProcessors.Processor<>'Default Processor' " & _
        "   AND tblAuditPr_A.Answer Not In ('NA','NF')" & _
        "   AND tblAuditPr.Status = 'Submitted'")
    Do While Not SupvRS.EOF
        'Send Supervisor Email
        Attachment = PARG.GenerateAuditReport(SupvRS.Fields("Supervisor"), parSupervisor, Me.txtFrom, Me.txtTo)
        Set EmailRS = db.OpenRecordset("SELECT * FROM tblProcessors WHERE Supervisor = " & GetSQLString(SupvRS.Fields("Supervisor")))
        If EmailRS.EOF Then
            Err.Raise -234923, Description:="Cannot find tblProcessors record for " & SupvRS.Fields("Supervisor") & "."
        End If
        If IsNull(EmailRS.Fields("SupervisorEmail")) Then
            MailTo = <redacted>
        Else
            MailTo = EmailRS.Fields("SupervisorEmail")
        End If
        Set EmailRS = Nothing
        Mailer.AddMailDocument MailTo:=MailTo, _
            Subject:=Subject, _
            Body:=Body, _
            Attachments:=Attachment, _
            From:=<redacted>
        'Iterate processor emails if requested.
        If Me.chkProcessor Then
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'----------------------------------------------------------------------------------------
'ERROR occurs here, but only after several supervisors have successfully passed through
            Set ProcRS = db.OpenRecordset("SELECT DISTINCT tblProcessors.Processor, tblProcessors.ProcessorEmail FROM tblAuditPr" & _
                " INNER JOIN (tblProcessors INNER JOIN tblAuditPr_A ON tblProcessors.Processor = tblAuditPr_A.Processor) " & _
                " ON tblAuditPr.PrAudit_ID = tblAuditPr_A.PrAudit_ID" & _
                " WHERE tblProcessors.Supervisor = " & GetSQLString(SupvRS.Fields("Supervisor")) & _
                " AND tblAuditPr.EndDate BETWEEN " & GetSQLDate(Me.txtFrom) & " AND " & GetSQLDate(Me.txtTo))
'----------------------------------------------------------------------------------------
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
            Do While Not ProcRS.EOF
                If Not IsNull(ProcRS.Fields("ProcessorEmail")) Then
                    On Error Resume Next
                    Attachment = PARG.GenerateAuditReport(ProcRS.Fields("Processor"), parProcessor, Me.txtFrom, Me.txtTo)
                    If Attachment <> "" Then
                        MailTo = ProcRS.Fields("ProcessorEmail")
                        Mailer.AddMailDocument MailTo:=MailTo, _
                            Subject:=Subject, _
                            Body:=Body, _
                            Attachments:=Attachment, _
                            From:=<redacted>
                    Else
                        Err.Clear
                    End If
                    On Error GoTo 0
                End If
                ProcRS.MoveNext
            Loop
            Set ProcRS = Nothing
        End If
        SupvRS.MoveNext
    Loop

如代码中所述,错误发生在成功执行其他主管的内部循环上。它确实在一个特定的个体上完全打破。使用GetSQLStringGetSQLDate函数(在必要时返回'分隔符,双精度',漂亮的字符串和#delimited日期,分别用于将Access查询传递到SQL Server),在复制模式下,我复制了在Access查询中给我带来问题的确切查询。它返回了超时错误,但更改数据库默认超时(以及关闭/打开数据库)无法解决问题。我将完全相同的查询粘贴到SSMS中(将#date delimiters替换为')并在那里执行得很好(大约1:30-2:00执行每次尝试)。

暂停点击这篇文章,我把一些错误陷入,看看我是否能得到SQL Server返回的实际错误消息,当它运行时没有错误。对我来说,这表明这可能是一个超时问题。任何人都有一个更有根据的猜测,它实际上是什么,或建议如何使查询更有效,所以它不会超时?

0 个答案:

没有答案
相关问题