0

ストアド プロシージャを介して SQL Server 2008 から取得したデータをテキスト ボックスに入力するバインドされていない Access フォームがありますGetIssueComponents()。以下は、このためのコードです。コードは機能します。私の問題は、一部の PC が一貫して関数呼び出しを実行し、データをすべて 1 秒以内に取得することです。ただし、他のコンピューターはこれを行うのに数十秒かかります。1 ~ 2 分かかるマシンも 1 台あります。マシンごとに所要時間は異なりますが、タイミングはそれぞれ一貫しています。

多くのコンピューターは同一の構成であるため、ハードウェアに直接関係しているようには見えません。実際、私たちが持っている最悪のコンピューターは、手順の実行が非常に高速なコンピューターの 1 つです。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
4

1 に答える 1

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 の詳細と、そのパフォーマンスに一貫性がない理由について引き続きお聞きしたいと思います。

于 2013-10-03T19:04:25.037 に答える