MS Access vba查询在哪里

MS Access vba查询在哪里,vba,Vba,简单的问题。 例如,我有一个客户有10个订单,每个订单包括6-10个项目 我想创建一个vba查询,该查询将显示特定客户的所有项目 我的问题是: x = CustomerNum Query = "Select OrderNum from CustomerOrderT Where CustomerNum = " & x Set result = CurrentDb.OpenRecordset(Query) y = result!OrderNum '(there is a lot of or

简单的问题。 例如,我有一个客户有10个订单,每个订单包括6-10个项目

我想创建一个vba查询,该查询将显示特定客户的所有项目

我的问题是:

x = CustomerNum
Query = "Select OrderNum from CustomerOrderT Where CustomerNum = " & x
Set result = CurrentDb.OpenRecordset(Query)

y = result!OrderNum
'(there is a lot of orders on y)

Query = "Select Product From OrderProducts Where OrderNum = " & y
Set result = CurrentDb.OpenRecordset(Query)
问题是我只能看到第一个订单的产品,而无法看到我在第一次查询中选择的所有订单的产品。 需要一些帮助来处理这种情况。
非常感谢。

您可以对所有订单执行单个查询:

x = CustomerNum
Query = "  SELECT CustomerOrderT.CustomerNum, " & _
                  CustomerOrderT.OrderNum, " & _
        "         OrderProducts.Product " & _
        "    FROM CustomerOrderT INNER JOIN OrderProducts " & _
               ON CustomerOrderT.OrderNum = OrderProducts.OrderNum " & _
        "   WHERE (((CustomerOrderT.CustomerNum)=" & x & ")) " & _
        "ORDER BY CustomerOrderT.OrderNum, " & _
        "         OrderProducts.Product;"
然后循环遍历所有记录,注意
OrderNum


但是,如果您无法控制变量
CustomerNum
的分配方式,就要当心这样构建SQL,因为您会受到SQL注入攻击

这是因为您只获得第一个订单,您需要遍历返回的记录集并获取每个订单号。Excel VBA代码几乎没有任何安全性,因此无法避免SQL注入攻击,VBA甚至受密码保护的代码都可以轻松访问/攻击。因此,如果担心安全性,就不应该使用它。相反,如果您对数据库执行自定义SQL,则无论代码是VBA还是VBA项目是否已锁定,但您允许用户在单元格或InputBox中输入恶意SQL代码段,而该代码段最终被插入到SQL字符串中,我知道,但在excel VBA中,几乎不可能避免恶意用户攻击SQL字符串,因为他可以轻松修改代码。唯一的解决方案是以有限的权限登录数据库。那么您也不需要关心SQL注入,因为注入只会返回一个错误。@caiohamamura在Excel VBA中,您将使用ADODB API/库,它完全支持参数化查询,Access使用的DAO也是如此。此外,通过对数据库服务器的Windows身份验证,无需在任何地方存储凭据,无论是在代码中还是在某些连接文件中。糟糕的代码在程序员身上,而不是语言。这是我的观点。SQL注入的问题是用户需要输入类似于
1go-DROP-TABLE-AnyTable-GO
的内容。如果您信任有权访问工作簿的用户,您可能不应该关心他们在筛选单元格或输入框中插入这些内容。