Ms access Ms Access前端,PostgreSQL后端高效插入到。。。返回。。。陈述

Ms access Ms Access前端,PostgreSQL后端高效插入到。。。返回。。。陈述,ms-access,postgresql,vba,Ms Access,Postgresql,Vba,嗨 我使用MS Access作为PostgreSQL数据库的前端。 我已经走到了死胡同: 如何获取passthrough SQL INSERT语句的返回值 我试过这样的方法: strSQL = "INSERT INTO someTable (col1, col2) VALUES ('val1', 'val2') RETURNING col0" 'Create passtrhough query dynamically (another function) CreateSPT ("some_tem

我使用MS Access作为PostgreSQL数据库的前端。 我已经走到了死胡同:

如何获取passthrough 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次:) 有人知道什么是正确的方法吗?我已经没有主意了


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

似乎下面的函数实现了这个功能。。。但不确定性能:)

'Insert-SQL passthrough
'将所有insert语句传递给此处
函数ISPT(SQLString)
作为字符串的Dim strODBCString
Dim cn作为新的ADODB.连接
将rs设置为新ADODB.Recordset
结果很长
strODBCString=_
“DRIVER={PostgreSQL Unicode};DATABASE=“&settings_getDBName()&”_
“SERVER=“&settings\u getServerAddress&_
“PORT=“&settings\u getServerPort&_
设置\u getConnStrParams
cn.开放式strODBCString
rs.opensqlstring,cn
'返回值
结果=rs.字段(0).值
"清理",
如果rs.state已关闭,则rs.Close
设置rs=无
如果cn.state adstate已关闭,则cn.Close
设置cn=Nothing
ISPT=结果
端函数

下面的函数似乎起到了作用。。。但不确定性能:)

'Insert-SQL passthrough
'将所有insert语句传递给此处
函数ISPT(SQLString)
作为字符串的Dim strODBCString
Dim cn作为新的ADODB.连接
将rs设置为新ADODB.Recordset
结果很长
strODBCString=_
“DRIVER={PostgreSQL Unicode};DATABASE=“&settings_getDBName()&”_
“SERVER=“&settings\u getServerAddress&_
“PORT=“&settings\u getServerPort&_
设置\u getConnStrParams
cn.开放式strODBCString
rs.opensqlstring,cn
'返回值
结果=rs.字段(0).值
"清理",
如果rs.state已关闭,则rs.Close
设置rs=无
如果cn.state adstate已关闭,则cn.Close
设置cn=Nothing
ISPT=结果
端函数

假设您有一个已保存的传递查询,那么您可以动态修改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。因此,第一个示例应该运行良好,并注意我甚至没有声明一个varialbe来实现这一点。如上所述,您只需要一个保存的传递查询。

假设您有一个保存的传递查询,那么您可以动态修改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。因此,第一个示例应该运行良好,并注意我甚至没有声明一个varialbe来实现这一点。如前所述,您只需要保存一个传递查询