2010-10-05 120 views
1

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

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

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

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

我不确定应该如何进行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

你绝对没错。这是正确的一点。 – Dariusz 2010-10-05 13:40:33

2

您可以使用Access“传递”查询为您的PostGreSQL函数。

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

SELECT Test1(); 

(我并不需要一个FROM子句。)

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

+0

也是非常有趣的解决方案。 – Dariusz 2010-10-06 14:03:33

0

路旧后nonwithstanding,我来到这里,通过谷歌,终于成功地放在一起,对我工作的一个功能,它可以帮助别人同样的问题:在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