从Access表单运行时功能性能不同

时间:2011-07-03 21:21:41

标签: performance ms-access access-vba

我有一个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表单运行函数时,我有什么理由表现不佳吗?

谢谢!

1 个答案:

答案 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,但这不会提高性能。