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