Производительность функции отличается при запуске из формы доступа - PullRequest
1 голос
/ 04 июля 2011

У меня есть хранимая процедура SQL, которую я вызываю с помощью функции VBA, которая заполняет два поля формы MS Access. Вся цель использования хранимой процедуры состоит в том, что запрос select при запуске в Access занимает 8-10 секунд, чтобы вернуть значения. Хранимая процедура = при запуске в SQL Mgt Studio возвращает значение в <1сек. Функция возвращает значения в окне «Немедленное» в Visual Basic в течение 1-2 секунд. Но когда я вызываю функцию (которая вызывает хранимую процедуру), требуется 8-10 секунд, чтобы вернуть значения в форму доступа, что разрушает всю мою цель использования хранимой процедуры. Вот функция: </p>

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

Есть ли какая-либо причина, по которой у меня будет плохая производительность при запуске функции из формы доступа?

Спасибо!

1 Ответ

1 голос
/ 05 июля 2011

Похоже, что хранимый процесс работает нормально, если вы можете вызвать функцию SP_Barcode в непосредственном окне VBA, и для возврата значений требуется 2 секунды.

При вызове сохраненного процесса возникают некоторые издержкииз Access, как перевод (доступ к ODBC для SQL Server и обратно) и создание подключения к базе данных.Но, похоже, это не так уж плохо, если он работает с той же скоростью из непосредственного окна в VBA, что и с SQL-сервера.

Несколько очевидных вещей, которые нужно проверить, во-первых, форма не связана или не связанак источнику данных, т. е. делает ли он больше подключений к локальным и / или таблицам / запросам / хранимым процессам сервера SQL, которые могут быть узким местом?Если у вас есть подчиненные формы, проверьте также их привязки.Когда вы открываете форму, открывается ли ваше окно VBA при запуске тестов?Закрой его.Это ускорит процесс.

Это форма с одной записью или форма с несколькими записями?Это может вызывать это более 1 раза, чтобы заполнить форму с несколькими записями.Это увеличит количество подключений к базе данных SQL.

Вы выполняете вызов функции из поля или события загрузки?Если он вызывается в полях, он может вызываться несколько раз, что может привести к созданию нескольких соединений.

Если это простая форма без другого источника данных, вы можете создать существующий промежуточный запрос и затем изменить параметр SQLиз родительской формы (я предполагаю, что это база данных внешнего доступа на ПК каждого отдельного пользователя, а не общий ADP, MDB, доступ к которому получают несколько пользователей).Если он все еще медленный, то это не ваша функция.

Создайте Passthrough Query, например «WasteMainfestInfo_Passthru», с предварительно заполненным параметром и определенной строкой подключения через окно свойств, и сохраните его:

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

Ваш код выглядит хорошо, поэтому я действительно не думаю, что этопроблема.Я бы добавил With и EndWith для объекта qdf, но это не сильно повысит производительность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...