我有一个SQL存储过程,我使用VBA函数调用它填充两个MS Access表单字段。使用存储过程调用的全部目的是,在Access中运行时,select查询需要8-10秒才能返回值。存储过程=在SQL中运行时Mgt Studio重新计算< 1秒。该函数在大约1-2秒内在Visual Basic“立即”窗口中返回值。但是,当我调用函数(调用存储过程)时,需要8-10秒才能将值返回到Access表单 - 这使我无法使用存储过程。这是功能:
Option Compare Database
Option Explicit
Public strTrack As String
Public strBar As String
Public strProf As String
Public strFac As String
Public Function SP_Barcode(MyParam As String)
Dim mydb As DAO.Database
Dim qdf As QueryDef
Dim sqlx As String
Dim rs As DAO.Recordset
strTrack = ""
strBar = ""
strProf = ""
strFac = ""
Set mydb = CurrentDb()
Set qdf = mydb.CreateQueryDef("")
sqlx = "exec dbo.SPWise_WasteManifestInfoByBarcode '" & MyParam & "'"
qdf.Connect = "ODBC;Description=IMDB_Dev;DRIVER=SQLServer;SERVER=server\dev;UID=mmmmmm;Trusted_Connection=Yes;DATABASE=IMDB_Dev"
qdf.SQL = sqlx
qdf.ReturnsRecords = True
Set rs = qdf.OpenRecordset()
If Not (rs.EOF And rs.BOF) Then
strTrack = rs.Fields(0)
strBar = rs.Fields(1)
strProf = rs.Fields(2)
strFac = rs.Fields(3)
Else
Exit Function
End If
Debug.Print strTrack, strBar, strProf, strFac
rs.Close
Set mydb = Nothing
Set qdf = Nothing
End Function
从Access表单运行函数时,我有什么理由表现不佳吗?
谢谢!
答案 0 :(得分:1)
如果您可以在VBA立即窗口中调用函数SP_Barcode,并且返回值需要2秒钟,则听起来存储过程正常工作。
从Access调用存储过程时会有一些开销,例如转换(访问ODBC到SQL Server并再次返回)和创建数据库连接。但听起来 如果它从VBA中的即时窗口以与它相同的速度运行并不是太糟糕 来自SQL服务器。
要检查的一些显而易见的事情,首先是未绑定或绑定到数据源的表单,即 它是否与本地和/或SQL服务器表/查询/存储过程建立了更多连接 可能是瓶颈?如果你有子表单也检查它们的绑定。当你 打开表单是运行基准测试时打开的VBA窗口?关闭它。它会 加快速度。
这是单记录表格还是多记录表格?它可以称之为 超过1次填充多记录表格。这会增加数量 连接到SQL db。
您是从字段还是加载事件进行函数调用?如果它被调用 在字段上,它可能被多次调用,可能会创建多个连接。
如果它是一个没有其他数据源的简单表单,你可以构建一个现有的passthrough查询,然后从父表单修改SQL param(我假设这是一个前端 在每个人的PC上访问数据库,而不是由多个用户访问的共享ADP,MDB)。 如果它仍然很慢那么它不是你的功能。
使用预填充创建像“WasteMainfestInfo_Passthru”这样的Passthrough查询 在参数和定义的连接字符串中通过属性窗口并保存它:
EXEC [dbo].[SPWise_WasteManifestInfoByBarcode ] @MyParmName = N'TestStringValue';
将表单的绑定设置为WasteMainfestInfo_Passthru
在打开此表单的父表单的事件中,执行以下操作:
Set mydb = CurrentDb() Set qdf = mydb.QueryDefs("WasteMainfestInfo_Passthru") sqlx = "exec [dbo].[SPWise_WasteManifestInfoByBarcode] @MyParmName = N'" & MyParam & "';" qdf.SQL = sqlx DoCmd.OpenForm "WasteMainfestInfo_Passthru", acNormal .... Set qdf = Nothing Set mydb = Nothing
您的代码看起来没问题,所以我真的不认为这是问题所在。我会为qdf对象添加一个With和EndWith,但这不会提高性能。