2013-10-02 2 views
0

저장 프로 시저 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 
+1

코드에 문제가없는 것 같습니다. 연결 및/또는 명령 객체의 짧은 시간 초과를 설정하여 시간 초과가 발생했는지 확인하는 것이 좋습니다. 아마도 SQL Server Profiler를 사용하여 거기에 잠금이 있는지 확인해야합니다. 서버 또는 서버의 SQL 서비스를 다시 부팅하면 어떻게됩니까? 처음으로 SP를 실행할 때 모든 시스템이 느려지나요? – HK1

+0

서버가 다른 이유로 여러 번 다시 시작되었으며 관련된 모든 PC가 자체적으로 재부팅되었습니다. 한 달 전에 코드를 구현 한 이후로 계속 진행되어 왔기 때문에 한순간이 아닌 것 같습니다. 서버에서는 언제든지 하나의 PC 만 활성 상태로 테스트를 수행했으며 모든 머신은 개별 특성을 느리게 또는 빠르게 프로 시저 시간으로 유지합니다. – Constablebrew

+0

중단 점을 설정하고 느린 시스템에서 병목 현상이 어느 단계인지를 정확히 파악할 수 있도록 코드를 한 줄씩 밟았습니까? – HansUp

답변

1

가 연결 한 PC에서 다음 다르게 수행 왜 에 같은 대답이 없어,하지만 난 OLE DB 형태로 변경하면 완전히 ODBC 것을 발견 했는가는 문제가 없습니다.

adoCnn.ConnectionString = "DRIVER=sql server;SERVER=" & DATABASE_IP & ";APP=Microsoft Office 2010;DATABASE=" & DATABASE_NAME & ";Network=DBMSSOCN;Trusted_Connection=Yes" 

그래서이 주위에 작품으로 계산하지만 난 여전히 OLE DB에 대한 세부 사항을 듣고 싶어요 왜 그렇게 일관성 수행 다음과 같이 나의 새로운 연결 문자열입니다.