我可以在Access中使用应用程序级功能(用户定义函数,基于表单的参数)打开记录集吗?



我希望用户能够使用组合框提供他们在GUI中进行的查询,然后将该查询加载到记录集中以对其进行进一步处理。如果查询包含用户定义函数或基于表单的参数,则会失败。

我的代码是这样的:

Private Sub cmbSelectionColumn_AfterUpdate()
Dim r As DAO.Recordset
Set r = CurrentDb.OpenRecordset("SELECT DISTINCT " & EscapeSQLIdentifier(Me.cmbSelectionColumn.Value) & " FROM " & EscapeSQLIdentifier(Me.cmbSelectionTable.Value))
Do While Not r.EOF
'Do stuff
r.MoveNext
Loop
End Sub

其中cmbSelectionColumn是用户选择的列,cmbSelectionTable是用户选择的表或查询,EscapeSQLIdentifier是一个转义并添加括号以确保字段和表名安全的函数。这在大多数情况下工作得很好,但在多种情况下会失败,例如涉及传递查询、用户定义函数和基于表单的参数。

是否有一种方法,我可以创建一个记录集从任何查询,在访问工作,而不必担心这一点?

有,不过你得耍点花招。

Forms很好地支持这些查询。表单有一个.RecordsetClone属性,允许我们检索记录集。

为了允许我们从代码中检索记录集,我们将创建一个新的空白表单,并向其添加一个模块(实际上,任何带有模块的表单都可以)。我们将它命名为frmBlank。

然后,我们可以调整代码以使用此表单检索记录集。

Private Sub cmbSelectionColumn_AfterUpdate()
Dim r As DAO.Recordset
Dim frm As New Form_frmBlank
frm.RecordSource = "SELECT DISTINCT " & EscapeSQLIdentifier(Me.cmbSelectionColumn.Value) & " FROM " & EscapeSQLIdentifier(Me.cmbSelectionTable.Value)
Set r = frm.RecordsetClone
Do While Not r.EOF
'Do stuff
r.MoveNext
Loop
End Sub

这允许我们检索记录集。表单不会弹出(因为我们没有将.Visible设置为True),并且一旦代码完成运行就会关闭,因为没有对它的活动引用。我还没有看到任何表或查询在Access中工作,但不使用这种方法,性能损失很小。它确实会产生奇怪的代码和带有空白模块的奇怪空白表单,这将导致您的数据库在删除时发生故障。

下面可能是打开引用基于表单的参数的DAO记录集的另一种方法:

Dim db As DAO.Database
Dim pr As DAO.Parameter
Set db = CurrentDb
With db.CreateQueryDef("", "SELECT DISTINCT " & EscapeSQLIdentifier(Me.cmbSelectionColumn.Value) & " FROM " & EscapeSQLIdentifier(Me.cmbSelectionTable.Value))
For Each pr In .Parameters
pr.Value = Eval(pr.Name)
Next pr
With .OpenRecordset
If Not .EOF Then
.MoveFirst
Do Until .EOF
' Do stuff
.MoveNext
Loop
End If
.Close
End With
End With

在这里,由于对查询范围之外对象的引用(例如对表单控件的引用)成为其参数名称与原始引用匹配的查询参数,因此对参数名称进行求值以产生表单控件持有的值,然后将参数值更新为该求值的结果。

最新更新