저장 프로 시저 GetIssueComponents()
을 통해 SQL Server 2008에서 검색 한 데이터로 텍스트 상자를 채우는 언 바운드 Access 폼이 있습니다. 다음은이 코드입니다. 코드가 작동합니다. 내 문제는 일부 PC는 일관되게 함수 호출을 실행하고 1 초 이내에 데이터를 검색한다는 것입니다. 그러나 다른 컴퓨터는이 작업을 수행하는 데 수십 초가 걸립니다. 우리는 1 분 또는 2 분이 걸리는 기계를 가지고 있습니다! 모든 기계는 소요 시간이 다르지만 각 기계는 타이밍과 일치합니다.한 PC에서 다른 PC로 일관성있는 저장 프로 시저 호출
많은 컴퓨터가 동일한 구성이므로 실제 하드웨어와 직접적인 관련이있는 것 같지 않습니다. 실제로 최악의 컴퓨터는 절차를 실행하는 데 가장 빠른 컴퓨터 중 하나입니다! 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
서버가 다른 이유로 여러 번 다시 시작되었으며 관련된 모든 PC가 자체적으로 재부팅되었습니다. 한 달 전에 코드를 구현 한 이후로 계속 진행되어 왔기 때문에 한순간이 아닌 것 같습니다. 서버에서는 언제든지 하나의 PC 만 활성 상태로 테스트를 수행했으며 모든 머신은 개별 특성을 느리게 또는 빠르게 프로 시저 시간으로 유지합니다. – Constablebrew
중단 점을 설정하고 느린 시스템에서 병목 현상이 어느 단계인지를 정확히 파악할 수 있도록 코드를 한 줄씩 밟았습니까? – HansUp