У меня есть несвязанная форма доступа, которая заполняет текстовое поле данными, полученными из SQL Server 2008, с помощью хранимой процедуры GetIssueComponents()
. Ниже приведен код этого. Код работает. Моя проблема в том, что некоторые ПК будут последовательно выполнять вызовы функций и получать данные за одну секунду. Однако для этого потребуются десятки секунд для других компьютеров. У нас даже есть одна машина, которая занимает полтора минуты или два! Каждая машина отличается тем, сколько времени они занимают, но каждый из них соответствует времени.Непоследовательная сохраненная процедура Вызов с одного ПК на другой
Это не похоже на что-то прямое, связанное с оборудованием, так как многие из компьютеров идентичны конфигурациям, а на самом деле худший компьютер, который у нас есть, является одним из самых быстрых при выполнении процедуры! Драйверы ODBC идентичны на всех компьютерах. Все компьютеры работают под управлением Windows XP, и я считаю, что все они имеют одинаковые исправления. Я не знаю, где еще искать, пожалуйста, помогите!
Global adoCnn As New ADODB.Connection
Public Function ADO_ConnectionInitialize() As Boolean
Const DEBUG_THIS_PROC_NAME = "ADO_ConnectionInitialize"
Debug_Proc_Start DEBUG_THIS_PROC_NAME, True
On Error GoTo ADO_ConnectionInitialize_Error
ADO_ConnectionInitialize = False
If adoCnn.state = adStateClosed Then
adoCnn.ConnectionString = "Provider=SQLOLEDB;Data Source=10.10.10.10;Initial Catalog=" & DATABASE_NAME & ";Integrated Security=SSPI;"
adoCnn.Open
End If
ADO_ConnectionInitialize = True
ADO_ConnectionInitialize_Error:
Select Case Debug_Proc_End(DEBUG_THIS_PROC_NAME, True)
Case vbAbort
Debug.Assert False
Resume
Case vbRetry
Resume
Case vbIgnore
Resume Next
Case vbCancel
Case vbOK
Case Else
End Select
End Function
Public Function ADO_StoredProcedure(ProcName As String, Optional parameters As Variant) As ADODB.parameters
Dim comm As ADODB.Command
Dim p As Variant
Dim param As ADODB.Parameter
If ADO_ConnectionInitialize() Then
Set comm = New ADODB.Command
With comm
.ActiveConnection = adoCnn
.CommandType = adCmdStoredProc
.CommandText = ProcName
For Each p In parameters
If IsNull(p(3)) Then
Set param = .CreateParameter(p(0), p(1), p(2))
Else
Set param = .CreateParameter(p(0), p(1), p(2), p(3))
End If
.parameters.Append param
If p(2) = adParamInput Or p(2) = adParamInputOutput Then
.parameters(p(0)).value = p(4)
End If
Next
End With
comm.Execute
Set ADO_StoredProcedure = comm.parameters
Set comm = Nothing 'Memory leak if this isn't done??
End If
End Function
Public Function GetIssueComponents(ByVal issueID As Long) As String
Const DEBUG_THIS_PROC_NAME = "GetIssueComponents"
Debug_Proc_Start DEBUG_THIS_PROC_NAME
On Error GoTo GetIssueComponents_Error
Dim params As ADODB.parameters
Dim p As ADODB.Parameter
Set params = ADO_StoredProcedure("dbo.GetIssueComponents", Array(_
Array("@ReturnValue", _
ADODB.DataTypeEnum.adInteger, _
ADODB.ParameterDirectionEnum.adParamReturnValue, _
Null, _
Null), _
Array("@issueID", _
ADODB.DataTypeEnum.adInteger, _
ADODB.ParameterDirectionEnum.adParamInput, _
Null, _
issueID), _
Array("@Components", _
ADODB.DataTypeEnum.adVarChar, _
ADODB.ParameterDirectionEnum.adParamOutput, _
255, _
Null) _
))
GetIssueComponents = params("@components").value
GetIssueComponents_Error:
Select Case Debug_Proc_End(DEBUG_THIS_PROC_NAME)
Case vbAbort
Debug.Assert False
Resume
Case vbRetry
Resume
Case vbIgnore
Resume Next
Case vbCancel
Case vbOK
Case Else
End Select
End Function
Я не вижу ничего плохого в вашем коде. Я бы рекомендовал установить короткие таймауты в вашем соединении и/или командных объектах, чтобы узнать, сработали ли таймауты. Вероятно, вам следует попробовать использовать SQL Server Profiler, чтобы увидеть, есть ли там какие-либо блокировки. Что произойдет, если вы перезагрузите сервер или SQL-сервисы на сервере? Все ли машины так же медленны при первом запуске SP? – HK1
Сервер был перезапущен в несколько раз (по другим причинам), и все задействованные ПК регулярно перезагружались. Это происходит с тех пор, как я реализовал код более месяца назад, поэтому он не кажется мимолетным. На сервере я делал тесты с одним активным ПК в любое время, и все машины сохраняют свои индивидуальные характеристики медленными или быстрыми процедурами. – Constablebrew
Вы установили точку разрыва и шагнули через код по строчке, чтобы определить, какой шаг является узким местом на медленных машинах? – HansUp