【问题标题】:MS Access 2013, SQL Server 2012 Express, query timeoutMS Access 2013、SQL Server 2012 Express、查询超时
【发布时间】:2016-07-27 01:51:09
【问题描述】:

我有一个在本地使用 SQL Server 2012 Express 的应用程序,它带有 Microsoft Access 2016 前端,带有表单、宏和模块。它用于现场收集检查数据,包括许多照片。问题是插入到主远程 SQL Server 2012 时出现错误:

Microsoft ODBC SQL Server 驱动程序错误:查询超时已过期

如果用户附加了 3 张以上的照片。

到目前为止,我已尝试提高远程 SQL Server(属性\连接)上的远程查询超时,我已将服务器刷新间隔提高到 240 秒(工具\选项)。我已经在 Access 的 SQL 函数中向 VBA 添加了代码:

Dim Conn As ADODB.Connection
Set Conn = New ADODB.Connection
Conn.ConnectionTimeout = 120

并且我在应用启动时运行的 AutoExec 宏中添加了以下函数:

Function SetTimeout()
      Dim Mydb As Database
      Set Mydb = CurrentDb
      Mydb.QueryTimeout = 640
  End Function

最后我在 VBA 的连接字符串末尾添加了“Connection Timeout=90”:

Server=localhost\SQLEXPRESS2012;Database=DamInspector; 

测试更新脚本只需要 67 秒即可运行,但我尝试了从“0”(无限)到 1024 的各种时间长度。具体的运行时错误是 '-2147217871 (80040e31)' [Microsoft][ ODBC SQL Server Driver]查询超时已过期
可能是其他方法?
我有 14 个表必须由 11 个检查员同步。其中7张桌子用于照片。在每个本地 SQL Express 实例上运行存储过程,而不是通过链接表使用 VBA 编写脚本会更好吗?

【问题讨论】:

  • 我认为您需要一种不同的方法。 ODBC 查询并不真正适合在可能不稳定的网络上传输如此多的数据(相对于网络速度)。某种后台传输(FTP?)。
  • 上传的不是图片文件,而是表格内的BLOB数据。
  • 是的,我明白了,这就是恕我直言的问题。我的意思是一种非常不同的方法,要么根本不将照片存储在数据库中,要么在通过不同渠道上传照片后由服务器进程插入它们。
  • 查看照片上传代码将非常有帮助,而不仅仅是尝试解决问题的代码。

标签: sql-server ms-access query-timeout


【解决方案1】:

我的解决方案是在本地 SQL Server 实例的存储过程中创建进程,并从 MS Access 表单中调用它。我还创建了一个小函数来在每个用户的 PC 上创建程序,因此我不必手动执行此操作。 由于这必须在全州范围内分发给用户,因此该操作在 Access 中进行。为了添加上传检查数据和图片所需的程序,我为每个以下格式创建了一个函数:

Function CreateProcAppendToAncillaryPics()
    'Change mouse to hour glass so end user knows something is going on
    Screen.MousePointer = 11

    Dim Conn As ADODB.Connection
        Set Conn = New ADODB.Connection
        Dim strCreateProcAncillaryImages As String
        Conn.Open ("Driver={SQL Server};Server=localhost\SQLEXPRESS2012;Database=DamInspector")

        strCreateProcAncillaryImages = "CREATE PROCEDURE dbo.AppendToAncillaryPics AS " & _
    "INSERT INTO [xxx.xxx.xxx.xxx].DamInspector.dbo.AncillaryImages " & _
                "(tableVersion, ID, techUName, DamsPhoto, PhotoDescription, structName, marker, thisdate, uuid)" & _
                " SELECT " & _
                    "L.tableVersion, L.ID, L.techUName, L.DamsPhoto, L.PhotoDescription, L.structName, L.marker, L.thisdate, L.uuid" & _
                " FROM DamInspector.dbo.AncillaryImages AS L" & _
                    " LEFT OUTER JOIN " & _
                    "[xxx.xxx.xxx.xxx].DamInspector.dbo.AncillaryImages AS R " & _
                    "ON L.uuid = R.uuid " & _
                "WHERE " & _
                    "R.uuid IS NULL;"

    Conn.Execute strCreateProcAncillaryImages
    Conn.Close
    'Set the mouse pointer back to normal
    Screen.MousePointer = 0
'Notify the user the process is complete.
    MsgBox "Upload Process Completed."
End Function

然后我创建了调用每个存储过程的函数:

Function Call_ProcAppendToGeneralPics()
Screen.MousePointer = 11
    Dim Conn As ADODB.Connection
        Set Conn = New ADODB.Connection
        Conn.Open ("Driver={SQL Server};Server=localhost\SQLEXPRESS2012;Database=DamInspector")

        Conn.Execute "AppendToAncillaryPics"
        Conn.Execute "AppendToAuxSpillwayPics"
        Conn.Execute "AppendToCrestPics"
        Conn.Execute "AppendToDownstreamPics"
        Conn.Execute "AppendToGeneralPics"
        Conn.Execute "AppendToOcPics"
        Conn.Execute "AppendToRiserPics"
        Conn.Execute "AppendToUpstreamPics"

    Conn.Close
    Screen.MousePointer = 0
'Notify the user the process is complete.
    MsgBox "Upload Process Completed."
End Function

有可能这一切都可以放在一个程序中,但在这个阶段我需要知道,如果插入远程服务器时出现问题,它在哪里发生了故障。到目前为止一切顺利,但我们才刚刚开始。

【讨论】:

  • 完成。它只是在全州范围内推出,所以我最初没有列出代码。
猜你喜欢
  • 1970-01-01
  • 2011-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-23
  • 2018-07-23
  • 1970-01-01
相关资源
最近更新 更多