在Ms-Access中将表名作为查询参数传递

时间:2014-08-06 15:35:03

标签: sql ms-access ms-access-2010

我正在研究一个由多个具有相同结构的表组成的访问数据库。我想要做的是使用表单上的组合框来选择表,然后使用所选的表名执行查询。

除了正在使用的表名之外,查询将是相同的。

我无法将表名从组合框传递给查询。

我知道它可能不是最好的数据库结构,但它是我需要做的。如果有人有任何建议分享这将是伟大的!

谢谢!

1 个答案:

答案 0 :(得分:0)

您不能简单地使用预编译的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

保存表单,关闭它,编译代码以查找任何错误。然后运行代码。希望这可以帮助。