У меня есть функция в моей базе данных mysql. Я пытаюсь вызвать функцию mysql в своем VBA внутри VBA funtion, чтобы получить результат, передав параметр из формы. Я не могу понять, как это сделать. Это то, что я до сих пор
function getval(Id As Long) As String
Dim strSQL As String
Dim rsTch As DAO.Recordset
strSQL = "SELECT getname(" & Id & ")"
Set rsTch = CurrentDb.OpenRecordset(strSQL, dbOpenSnapshot)
End Function
Но я получаю эту ошибку
Неопределенная функция getname()
getname()
- моя функция mysql. Я получаю результат, когда я запускаю запрос в workbench mysql.
getval()
- моя функция VBA, из которой я выполняю id
запроса, является параметром функции mysql, пожалуйста, помогите мне
Это MDAC-Engine (Jet), который анализирует SQL перед отправкой в MySQL. Двигатель видит функцию getname()
и ищет ее в vba-коде, но ее там нет, поэтому возникает ошибка Undefined function getname()
.
Чтобы этого избежать, вы должны обойти разбор MDAC, используя запрос-транзит, где SQL-код отправляется в MySQL как есть.
Есть два варианта.
Используйте ADO вместо DAO, как предложил Тим. Это рекомендуемый вариант, используемый профессионалами (я по-прежнему в основном на DAO, но ADO находится поверх моего списка навыков - рядом с природой).
или оставаться в DAO и создавать Query-Def, как описано в sql-server-passthrough-query-as-basis-for-a-dao-recordset-in-access от Gord Thompson.
Function getval(Id As Long) As String
Dim strSQL As String
Dim qdf As DAO.QueryDef, rst As DAO.Recordset
strSQL = "SELECT getname(" & Id & ")"
Set qdf = CurrentDb.CreateQueryDef("")
With qdf
.Connect = "ODBC;Driver={MySQL ODBC 5.3 ANSI Driver};" _
& "SERVER=Your Server;PORT=3306;DATABASE=Your Database;" _
& "USER=Your User;PASSWORD=1234;OPTION=3"
.SQL = strSQL
.ReturnsRecords = True
Set rst = .OpenRecordset
End With
Debug.Print rst(0)
rst.Close
Set rst = Nothing
Set qdf = Nothing
End Function