如何从 VBA 代码执行 PostgreSQL 函数?

Posted

技术标签:

【中文标题】如何从 VBA 代码执行 PostgreSQL 函数?【英文标题】:How to execute PostgreSQL function from VBA code? 【发布时间】:2010-10-05 12:14:40 【问题描述】:

如何从 VBA 代码执行存储在 PostgreSQL 中的名为 Test1 的函数?

例如,我们有一个函数定义如下:

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。我不知道如何执行此操作,如何执行?

【问题讨论】:

【参考方案1】:

您可以对 PostGreSQL 函数使用 Access“直通”查询。

我在我的 PostGreSQL 服务器上创建了您的函数和表。然后在 Access 中创建了一个新的传递查询。我对查询的 SQL 属性使用了 PostGreSQL 语句。

SELECT Test1();

(我不需要 FROM 子句。)

在查询属性表上,我分配了 ODBC 连接字符串,并为“返回记录”属性选择了“是”。然后可以从 Access 用户界面运行查询,或者从 VBA 代码中使用该查询来打开基于该查询的 DAO 记录集。

【讨论】:

也是非常有趣的解决方案。【参考方案2】:

失败是因为您已将 dbs 设置为当前数据库。当您执行此语句时,访问将查找表“Test1()”并在找不到时抛出一个嘶嘶声。

我不确定如何使用 postgre 执行此操作,但这就是我使用 SQL Server 做类似事情的方式,所以我认为它会是相同的,但使用不同的连接字符串

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

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

Rst.open strsql

等等

【讨论】:

【参考方案3】:

尽管有很旧的帖子,我是通过 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

【讨论】:

以上是关于如何从 VBA 代码执行 PostgreSQL 函数?的主要内容,如果未能解决你的问题,请参考以下文章

从 Excel VBA 执行 Git Bash

为什么VBA的VarType函数说这个COM对象是一个字符串? (Object是.NET的System.Object类的COM版本的实例。)这是一个错误吗?

从 VBA 打开工作簿并禁用 Workbook_Open() 代码?

如何使用 PostgreSql 中的子字符串函数从字符串中提取单词

如何使用 VBA 执行插入/更新记录的存储过程?

EXCEL的VBA,在执行大量工作时,开始很快,后面很慢。不知道如何解决。