2013-10-02 2 views
0

У меня есть несвязанная форма доступа, которая заполняет текстовое поле данными, полученными из 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 
+1

Я не вижу ничего плохого в вашем коде. Я бы рекомендовал установить короткие таймауты в вашем соединении и/или командных объектах, чтобы узнать, сработали ли таймауты. Вероятно, вам следует попробовать использовать SQL Server Profiler, чтобы увидеть, есть ли там какие-либо блокировки. Что произойдет, если вы перезагрузите сервер или SQL-сервисы на сервере? Все ли машины так же медленны при первом запуске SP? – HK1

+0

Сервер был перезапущен в несколько раз (по другим причинам), и все задействованные ПК регулярно перезагружались. Это происходит с тех пор, как я реализовал код более месяца назад, поэтому он не кажется мимолетным. На сервере я делал тесты с одним активным ПК в любое время, и все машины сохраняют свои индивидуальные характеристики медленными или быстрыми процедурами. – Constablebrew

+0

Вы установили точку разрыва и шагнули через код по строчке, чтобы определить, какой шаг является узким местом на медленных машинах? – HansUp

ответ

1

У меня нет ответа на вопрос, почему соединение выполняет по-разному от одного ПК к другому, но я считаю, что изменение формы 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 и почему он выполняет так непоследовательно.

Смежные вопросы