如何从 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 函数?的主要内容,如果未能解决你的问题,请参考以下文章
为什么VBA的VarType函数说这个COM对象是一个字符串? (Object是.NET的System.Object类的COM版本的实例。)这是一个错误吗?
从 VBA 打开工作簿并禁用 Workbook_Open() 代码?