【发布时间】:2022-01-24 00:50:38
【问题描述】:
我刚刚复制粘贴在 stackoverflow 中找到的解决方案,做了一些调整以适应我的需要,但......它不起作用:| 代码如下:
Public Function getAssortmentTypes(Optional personId As Variant) As DAO.Recordset 'personId is integer
Dim strQuery As String
Dim qdf As DAO.QueryDef
Dim rst As DAO.Recordset
If IsMissing(personId) Then
strQuery = "SELECT assortment_type.type_id, assortment_type.type_name AS qryTest FROM assortment_type"
Else
strQuery = "SELECT * FROM get_non_deleted_assortment_types_by_user(" & personId & ")"
End If
Set qdf = CurrentDb.CreateQueryDef("")
With qdf
.SQL = strQuery
.Connect = getDBConnectionString
.ReturnsRecords = True
End With
Set rst = qdf.OpenRecordset
Debug.Print rst!qryTest
Set getAssortmentTypes = rst
End Function
在我的 postgresql 数据库中,我确实有工作功能和适当的表。我已经用 DBEaver 测试了 sql 查询并且它们有效。当我调用没有参数的函数时,我只收到一行(应该是大约 30 行)。使用参数,我期望过滤结果集,但收到“来自子句中的错误 3131 语法错误”。 有人可以帮我吗? TY
【问题讨论】:
-
您正在使用 DAO 从 MS Access 的 VBA 宏中查询 PostgreSQL 数据库? 哇
-
(" & personId & ")" -
sql 注入问题仅适用于用户输入——如果 personID 是用户输入,那么建议很好——但我们没有理由怀疑甚至暗示 personID 是用户输入的结果。很可能 personID 是来自其他代码的 PK 记录 ID - 不是基于用户输入,而是基于记录的 PK 行 - 因此该代码很好。
-
顺便说一下,使用DAO(即ODBC)是推荐使用的技术堆栈。 OLEdb 是一种仅限 Windows 的技术——而 ODBC 和 DAO 是前进的道路,因为其他平台不再支持 ADO。事实上,即使是微软 10 年前也推荐过这个。然而,在 2018 年,他们推翻了这一决定?使用 ODBC 堆栈是推荐的选择 - 因为这是一个行业标准 - 而 ADO 不是。 (不要与 ado.net 混淆)。
-
@Dai - 是的,你是对的。好吧,MS Access 根本不是安全重点,正如 Albert 提到的,我正在使用用户输入未提供的 TempVars 存储的 var。本例中可以使用 DAO。也许在一些更复杂的情况下它无法工作,但这里没关系。
标签: vba ms-access dao pass-through