Как выполнить функцию PostgreSQL из кода VBA? - PullRequest
1 голос
/ 05 октября 2010

Как мне выполнить функцию с именем Test1, которая хранится в PostgreSQL из кода VBA?

Например, у нас есть определение функции следующим образом:

CREATE OR REPLACE FUNCTION "public"."Test1" (
)
RETURNS bit AS
$body$
BEGIN
    INSERT INTO test ("name") VALUES ('1');
RETURN 1;

END;
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
COST 100;

Теперь яЯ пытаюсь выполнить эту функцию следующим образом:

Function TestCall()
Dim dbs As DAO.Database
Dim qdf As DAO.QueryDef
Dim rst As DAO.Recordset

Dim strSQl As String

strSQl = "SELECT * FROM Test1();" 

Set dbs = CurrentDb

Set rst = dbs.OpenRecordset(strSQl, dbOpenDynaset, dbSeeChanges)
'this doesnt work as well: syntax error'
dbs.Execute strSQl 


If Not (rst.BOF And rst.EOF) Then
    do some work here
End If

End Function

Но я получаю Syntax Error near FROM.Я понятия не имею, как это сделать, как это можно сделать?

Ответы [ 3 ]

2 голосов
/ 05 октября 2010

Вы можете использовать «сквозной» запрос Access для вашей функции PostGreSQL.

Я создал вашу функцию и таблицу на моем сервере PostGreSQL. Затем создал новый сквозной запрос в Access. Я использовал оператор PostGreSQL для свойства SQL запроса.

SELECT Test1();

(мне не нужно предложение FROM.)

На листе свойств запроса я назначил строку подключения ODBC и выбрал Да для свойства «Возвращает записи». Затем запрос можно запустить из пользовательского интерфейса Access или использовать из кода VBA для открытия набора записей DAO на основе этого запроса.

1 голос
/ 05 октября 2010

Сбой, потому что вы установили dbs для текущей базы данных. Когда вы выполните эту инструкцию, доступ будет искать таблицу «Test1 ()» и выбрасывать шипение, когда он не может ее найти.

Я не уверен, как это сделать с Postgre, но я поступил аналогично с SQL-сервером, поэтому я предполагаю, что это будет то же самое, но с другой строкой соединения

Dim dbCon as new ADODB.Connection
Dim rst as new ADODB.Recordset

Dbcon.connectionstring=”Your connection string goes here!”
Dbcon.open

Rst.open strsql

и т. Д.

0 голосов
/ 20 сентября 2016

Несмотря на старый пост, я пришел сюда через Google и, наконец, сумел собрать функцию, которая работает для меня, она может помочь кому-то еще с той же проблемой: в общедоступном модуле в MS Access сохраните следующее

Option Compare Database
Public Function ProcessSTP_Fn(PostgresFnString As String)
    Dim qdf As DAO.QueryDef, rst As DAO.Recordset
''Server Settings
   On Error GoTo ErrHandler
    myServerName = "127.0.0.1"
    myDatabaseName = "my_db"
    myUserName = "my_user"
    myPassword = "my_pass"

''Connection String Components
    sqlConnString = ""
    sqlConnString = sqlConnString & "ODBC;Driver={PostgreSQL ANSI};"
    sqlConnString = sqlConnString & "Server=" & myServerName & ";"
    sqlConnString = sqlConnString & "Port=5432;"
    sqlConnString = sqlConnString & "Database=" & myDatabaseName & ";"
    sqlConnString = sqlConnString & "Uid=" & myUserName & ";"
    sqlConnString = sqlConnString & "Pwd=" & myPassword & ";"

''Create QueryDef and run the Postgres Function
    Set qdf = CurrentDb.CreateQueryDef("")
        qdf.Connect = sqlConnString
        qdf.SQL = PostgresFnString ''From the parameters
        qdf.ReturnsRecords = True
        Set rst = qdf.OpenRecordset
            ''Return any results expected
        rst.Close
        Set rst = Nothing
    Set qdf = Nothing
    Debug.Print "Query: " & PostgresFnString & " Passed Sucessfully At " & Now()
   Exit Function
ExitHandler:
   On Error GoTo 0
   ErrorState = True
   Exit Function
ErrHandler:
    Dim MyError As Error
    MsgBox Errors.Count
    For Each MyError In DBEngine.Errors
      With MyError
        MsgBox .Number & " " & .Description
      End With
    Next MyError
    GoTo ExitHandler
End Function

Public Sub TestPostgresFn()
    PostgresFnString = "SELECT * FROM Test1();"
    Call ProcessSTP_Fn(PostgresFnString)
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...