是否可以在访问中基于combobox.value创建动态sql语句?

问题描述 投票:0回答:2

我用两个不同的组合框制作了一个表格。此工具的用户可以在combobox1中选择:表(必须进行过滤),第二个combobox2是要过滤的条件(例如Language =“EN”),此查询的输出必须位于tablex中。

我所遇到的问题是我无法找到将combobox1的值传递给sql语句的解决方案。第二个就是:where [language] = forms!form!combo2.value,但是我找不到解决方案的部分是:select * from(combobox1 value)?如何将组合框值作为要过滤的表名传递?谁能帮帮我吗?

access-vba ms-access-forms
2个回答
0
投票

您不能在查询的WHERE子句中拥有表名(可能有一种hacky方式来执行此操作,但在任何情况下都应该不鼓励)。

如果要从多个表中的一个中选择数据,最好的办法是使用VBA动态生成SQL。一种方法(特别是如果您希望/需要在最终用户的数据表视图中打开您的查询)是一个“虚拟”查询,您可以使用表单选择填充SQL。

例如,假设我们有2个表:tTable1tTable2。这两个表都有一个名为Language的列。您希望用户使用可选过滤器从第一个或第二个表中选择数据。

  1. 创建一个包含2个组合框的表单:一个用于表,另一个用于选择条件。听起来你已经完成了这一步。
  2. 在此表单上有一个用于打开查询的按钮。此按钮的press事件的代码应如下所示: Private Sub cmdRunQuery_Click() Dim sSQL As String Dim db As DAO.Database Dim qdf As DAO.QueryDef If Not IsNull(Me.cboTableName.Value) Then sSQL = "SELECT * FROM " & Me.cboTableName.Value If Not IsNull(Me.cboFilter.Value) Then sSQL = sSQL & vbNewLine & _ "WHERE Language=""" & Me.cboFilter & """" End If Set db = CurrentDb Set qdf = db.QueryDefs("qDummyQuery") qdf.SQL = sSQL DoCmd.OpenQuery qdf.Name End If End Sub

请注意如何生成SQL。当然,使用此方法,您需要保护自己免受SQL注入:您应该只允许组合框中的预定义值。但这可以作为概念的证明。

如果您不需要显示查询结果,则不需要使用虚拟查询:您可以根据SQL和进程打开记录集。


0
投票

如果在组合框的afterupdate事件中运行代码,则可以设置如下的SQL语句:

Private Sub combobox2_AfterUpdate()
   someGlobalVar = "Select * FROM " & me.combobox1.value & " WHERE language = " & _
         me.combobox2.value
End Sub

然后在任何需要的地方使用SQL字符串调用全局。

© www.soinside.com 2019 - 2024. All rights reserved.