Ms前端,PostgreSQL后端高效INSERT INTO ... RETURNING ...语句

时间:2010-09-26 10:20:25

标签: ms-access postgresql vba

HI,

我正在使用MS Access作为PostgreSQL数据库的前端。 我已陷入死胡同:

如何获得直通SQL INSERT语句的返回值?

我试过这样的事情:

strSQL = "INSERT INTO someTable (col1, col2) VALUES ('val1', 'val2') RETURNING col0"
'Create passtrhough query dynamically (another function)
CreateSPT ("some_temp_query", strSQL)
idvalue = DLookup("col0", "some_temp_query")

以这种方式表示INSERT语句将被调用2次:) 有人知道什么是正确的方法吗?我已经没有想法了

编辑:我正在使用最新的psqlODBC驱动程序

2 个答案:

答案 0 :(得分:1)

假设您有一个保存的pass-though查询,那么您可以动态修改sql,并以这种方式返回值。以下代码运行时甚至不必声明任何变量。

With CurrentDb.QueryDefs("qryPassReturn")
   .SQL = "INSERT INTO someTable (col1, col2) VALUES ('val1', 'val2') RETURNING col0"
   Debug.Print .OpenRecordset()(0)
End With

我想你可以声明一个reocrdset来接收返回值,然后转到:

Dim rstReturn  As DAO.Recordset

With CurrentDb.QueryDefs("qryPassReturn")
   .SQL = "INSERT INTO someTable (col1, col2) VALUES ('val1', 'val2') RETURNING col0"
   Set rstReturn = .OpenRecordset
End With

Debug.Print rstReturn(0)

因此,您只需传递sql,返回的值将显示为标准reocrdset。所以,第一个例子应该运行良好并注意我甚至没有声明一个变量来使这个工作。您提到的只是需要一个保存的传递查询。

答案 1 :(得分:0)

似乎下面的功能可以解决问题......不确定性能虽然:)

'Insert-SQL passthroug
'Pass here all the insert statements
Function ISPT(SQLString)
Dim strODBCString As String
Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim result As Long

    strODBCString = _
      "DRIVER={PostgreSQL Unicode};DATABASE=" & settings_getDBName() & _
      ";SERVER=" & settings_getServerAddress & _
      ";PORT=" & settings_getServerPort & _
      settings_getConnStrParams

      cn.Open strODBCString

      rs.Open SQLString, cn


      'return value
      result = rs.Fields(0).Value



    'Cleanup
    If rs.state <> adStateClosed Then rs.Close
    Set rs = Nothing
    If cn.state <> adStateClosed Then cn.Close
    Set cn = Nothing

    ISPT = result

End Function