Ms access 从一台PC到另一台PC的存储过程调用不一致
我有一个未绑定的访问表单,它使用通过存储过程Ms access 从一台PC到另一台PC的存储过程调用不一致,ms-access,vba,oledb,ado,Ms Access,Vba,Oledb,Ado,我有一个未绑定的访问表单,它使用通过存储过程GetIssueComponents()从SQL Server 2008检索的数据填充文本框。下面是代码。代码是有效的。我的问题是,有些PC会在一秒钟内始终如一地执行函数调用并检索数据。但是,其他计算机需要数十秒才能完成此操作。我们甚至有一台机器需要整整一两分钟!每台机器所用的时间不同,但每台机器都与时间一致 这似乎与硬件没有任何直接关系,因为许多计算机都是相同的配置,事实上,我们拥有的最差的计算机是执行过程最快的计算机之一!ODBC驱动程序在所有计算
GetIssueComponents()
从SQL Server 2008检索的数据填充文本框。下面是代码。代码是有效的。我的问题是,有些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
我不知道为什么不同pc之间的连接性能不同,但我确实发现将OLEDB更改为ODBC完全消除了这个问题。我的新连接字符串如下所示:
adoCnn.ConnectionString = "DRIVER=sql server;SERVER=" & DATABASE_IP & ";APP=Microsoft Office 2010;DATABASE=" & DATABASE_NAME & ";Network=DBMSSOCN;Trusted_Connection=Yes"
因此,这算是一种变通方法,但我仍然希望听到有关OLEDB的详细信息,以及它执行如此不一致的原因 我看不出你的代码有什么问题。我建议您在连接和/或命令对象上设置短超时,以查看超时是否被触发。您可能应该尝试使用SQL Server Profiler查看是否有任何锁显示在其中。如果重新启动服务器或服务器上的SQL服务,会发生什么情况?所有的计算机在第一次运行SP时都一样慢吗?服务器已经重新启动了几次(出于其他原因),所有涉及的PC都有自己的定期重新启动。自从我在一个多月前实现该代码以来,这种情况就一直在发生,所以它似乎不是昙花一现。在服务器上,我在任何时候都只使用一台PC进行测试,所有机器都保持其各自的慢速或快速过程时间。您是否设置了断点并逐行遍历代码以确定哪一步是慢速机器上的瓶颈?在过程
ADO_StoredProcedure
中,行comm.Execute
是挂起的地方。连接是一个OLE DB,我不小心用ODBC标记了它。。。我会修好的。