MS Access 2013, SQL Server 2012 Express, время ожидания запроса

У меня есть приложение, использующее SQL Server 2012 Express на локальном компьютере с интерфейсом Microsoft Access 2016 с формами, макросами и модулями. Он используется в полевых условиях для сбора инспекционных данных, в том числе многих фотографий. Проблема в том, что при вставке в основной удаленный SQL Server 2012 я получаю сообщение об ошибке:

Ошибка драйвера Microsoft ODBC SQL Server: истекло время ожидания запроса

если пользователь прикрепляет более 3 фотографий.

До сих пор я пытался увеличить время ожидания удаленного запроса на удаленном сервере SQL (Свойства \ Соединения), я увеличил интервал обновления сервера до 240 секунд (Инструменты \ Параметры). Я добавил код в VBA в функции SQL в Access:

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

Наконец, я добавил "Connection Timeout=90" в конец строки подключения в VBA:

Server=localhost\SQLEXPRESS2012;Database=DamInspector; 

Тестовый сценарий обновления занимает всего 67 секунд, но я пробовал разные промежутки времени от "0" (бесконечно) до 1024. Конкретная ошибка времени выполнения - "-2147217871 (80040e31)" [Microsoft][ODBC SQL Server Драйвер] Истекло время ожидания запроса
Возможно, другой метод?
У меня есть 14 таблиц, которые должны быть синхронизированы 11 инспекторами. 7 таблиц для фотографий. Будет ли лучше запускать хранимую процедуру на каждом локальном экземпляре SQL Express, а не создавать сценарии для VBA через связанные таблицы?

1 ответ

Решением для меня было создать процесс в хранимых процедурах на локальном экземпляре SQL Server и вызвать его из формы MS Access. Я также создал небольшую функцию для создания процедур на ПК каждого пользователя, поэтому мне не пришлось делать это вручную. Поскольку это должно было распространяться среди пользователей по всему штату, действие происходит в 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

Вполне возможно, что все это можно было бы поместить в одну процедуру, но на этом этапе мне нужно было знать, были ли проблемы со вставкой на удаленный сервер, где он выходил из строя. Пока все хорошо, но мы только начали.

Другие вопросы по тегам