在 Ms-Access 中将表名作为查询参数传递
Posted
技术标签:
【中文标题】在 Ms-Access 中将表名作为查询参数传递【英文标题】:Passing a table name as a query parameter in Ms-Access 【发布时间】:2014-08-06 15:35:03 【问题描述】:我正在开发一个由具有相同结构的多个表组成的 access 数据库。我要做的是使用表单上的组合框来选择表,然后使用所选表名执行查询。
除了正在使用的表名之外,查询将是相同的。
我无法将组合框中的表名传递给查询。
我知道它可能不是最好的数据库结构,但它是我需要做的。如果有人有任何建议可以分享,那就太好了!
谢谢!
【问题讨论】:
您能在构建查询的位置显示代码吗?只是不要逃避这个名字...... 我没有什么要展示的。我试图用 sql 来做这件事,因为我的 VBA 技能有点基础。我正在尝试的是 SELECT table.[fieldname],但是在我选择表的地方,我需要传递从名为“tableSelect”的下拉菜单中选择的表名 好吧,您可以使用组合框上的事件onChange
或afterUpdate
来访问它的属性并在那里运行查询...
t.[fieldname], ... FROM [" & me.combo1 & "] As t
希望您对您的用户充满信心。
【参考方案1】:
您不能简单地使用预编译的 SQL 查询来做到这一点。你需要一点 VBA 才能让它运行,这就是你要做的。
创建一个包含一个 ComboBox 和一个按钮的表单。
将 ComboBox 命名为 tableNameCombo,将按钮命名为 runQueryBtn。保存表单,名称为 frm_QueryRun。
按照以下方式创建一个新的查询,
SELECT * FROM randomTableName;
将此保存为 qry_Tmp。
现在回到表单设计,然后在表单的属性表中,查找当前方法。然后将以下代码粘贴到 Form Current 中。
注意:如果这是您的第一个 VBA,请查看:http://www.baldyweb.com/FirstVBA.htm
Private Sub Form_Current()
Dim tblStr As String
Dim dbObj As DAO.Database, tdObj As DAO.TableDef
Set dbObj = CurrentDB()
Me.tableNameCombo.RowSourceType = "Value List"
For Each tdObj In db.TableDefs
If Left(tdObj.Name, 4) <> "MSys" Then tblStr = tblStr & tdObj.Name & ";"
Next
tblStr = Left(tblStr, Len(tblStr)-1)
Me.tableNameCombo.RowSource = tblStr
Set dbObj = Nothing
End Sub
完成后,您需要构建 qry_Tmp。类似的,点击按钮。
Private Sub runQueryBtn_Click()
Dim dbObj As DAO.Database, qdObj As DAO.QueryDef
If Me.tableNameCombo.ListIndex = -1 Then
MsgBox "Table Name needs to be selected, before continuing.", vbCritical
Exit Sub
End If
Set dbObj = CurrentDB()
Set qdObj = dbObj.QueryDefs("qry_Tmp")
qdObj.SQL = "SELECT " & Me.tableNameCombo & ".* FROM " & Me.tableNameCombo & ";"
qdObj.Execute dbFailOnError
qdObj.Close
Set qdObj = Nothing
Set dbObj = Nothing
End Sub
保存表单,关闭它,编译任何错误的代码。然后运行代码。希望这可以帮助。
【讨论】:
这真的很有帮助。当我想将列名和表名作为参数传递给 Access SQL 查询时,我遇到了这个问题。你知道这是否可行吗?以上是关于在 Ms-Access 中将表名作为查询参数传递的主要内容,如果未能解决你的问题,请参考以下文章
通过将列和表名作为参数传递来创建 BigQuery 存储过程
如何在 Oracle SQL Developer 的存储过程中将表名列表作为参数传递?如何使用 PLSQL VARRAY 或嵌套表?