Могу ли я ускорить эту функцию VBA, которая запрашивает (AWS) mysql db? - PullRequest
2 голосов
/ 29 мая 2019

Я написал функцию (см. Ниже), которая запрашивает внешнюю базу данных MySQL, настроенную на AWS, и возвращает одно значение.Он отлично работает - как я и хотел на самом деле - за исключением того, что он довольно медленный.Если вы просто используете функцию в электронной таблице один раз, это нормально, но если вы хотите вытянуть, скажем, 10 различных чисел из вашей базы данных в вашу электронную таблицу, есть досадная пауза в несколько секунд (15?), Пока все они обновляются.,Это не конец света, но кажется, что это может / должно быть быстрее.

Я задавался вопросом, была ли проблема в том, что я открывал новое соединение с БД каждый раз, когда я запускал функцию, поэтому япопытался разделить процесс на Sub, который подключается к БД, и функцию, которая просто отправляет запросы (см. далее ниже).Я решил запустить подпрограмму «Подключить» один раз, когда я впервые открыл электронную таблицу, а затем использовал функцию запросов по мере необходимости, но это не сработало вообще.Я только что получил «# ЗНАЧЕНИЕ» в любой ячейке, которая включала функцию.

Я понимаю, что это довольно открытый вопрос, и я прошу прощения, но я в тупике, и я подумал, что кто-то на stackoverflow может иметь некоторые хорошие предложения.Просто кажется, что это должно быть быстрее, чем есть.Наверное, само собой разумеется, но: я новичок в VBA и нахожу это довольно вялым и запутанным.

Исходная функция:

Public Function Quer(Param1 As String, Param2 As String, Param3 As String)

    Dim Conn As ADODB.Connection
    Dim rs1 As ADODB.Recordset
    Dim connstring As String

    Set Conn = New ADODB.Connection

    connstring = "connection string"

    Conn.Open connstring

    Dim querystring1 As String

    querystring1 = "Select " & Param1 & " FROM table WHERE Param2 = " & Param2 & " AND Param3 = " & Param3

    Set rs1 = New ADODB.Recordset
    rs1.Open querystring1, Conn

    Record = rs1.GetRows

    Quer = Record(0, 0)


End Function

Как я уже говорил, вышеприведенная функция работает нормально, просто медленно.

Моя «вторая попытка» была следующей: попытка разделить соединение с основной базой данных и отдельные запросы.Насколько я мог судить, это был полный провал, но, возможно, есть какое-то простое исправление, которое я пропустил.Или это имеет значение?Будет ли этот подход более быстрым, даже если он сработает?

Sub Connect()

    Dim Conn As ADODB.Connection
    Dim connstring As String

    Set Conn = New ADODB.Connection

    connstring = "connection string"

    Conn.Open connstring
End Sub

Public Function Quer(Param1 As String, Param2 As String, Param3 As String)

    Dim querystring1 As String
    Dim rs1 As ADODB.Recordset

    querystring1 = "Select " & Param1 & " FROM table WHERE Param2 = " & Param2 & " AND Param3 = " & Param3

    Set rs1 = New ADODB.Recordset
    rs1.Open querystring1, Conn

    Record = rs1.GetRows

    Quer = Record(0, 0)

End Function

Любые мысли или предложения будут высоко оценены.

1 Ответ

2 голосов
/ 30 мая 2019

Основываясь на комментарии @Alex K. выше, я изменил код следующим образом:

Dim Conn As ADODB.Connection

Sub Connect()

    Dim connstring As String

    Set Conn = New ADODB.Connection

    connstring = "connection string"

    Conn.Open connstring
End Sub

Public Function Quer(Param1 As String, Param2 As String, Param3 As String)

    Dim querystring1 As String
    Dim rs1 As ADODB.Recordset

    querystring1 = "Select " & Param1 & " FROM table WHERE Param2 = " & Param2 & " AND Param3 = " & Param3

    Set rs1 = New ADODB.Recordset
    rs1.Open querystring1, Conn

    Record = rs1.GetRows

    Quer = Record(0, 0)

End Function

Conn теперь установлен как переменная уровня модуля, поэтому он работает как в Sub Connect ()и функция Quer.С этим изменением функция Quer работает и действительно обновляется намного быстрее.Это изменение не устраняет проблемы безопасности / уязвимости в моем коде, но оно решает мою первоначальную проблему и значительно помогает мне в том, что я пытаюсь сделать.Спасибо всем, кто прокомментировал вашу помощь.

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