2

这与这个问题有些相关,但我希望可能有一个比定义用户定义函数更优雅/简单的解决方案。

背景

本质上,这是一个常见问题:我需要动态修改 Access 表单上组合框控件的 RowSource 查询。不同之处在于,结果查询可能在执行时抛出异常。这是因为查询的源表存在于不同的数据库文件中,该文件是动态定义的,可能不存在,或者即使文件存在,所需的表或列也可能不存在。

理想情况下,我希望能够在分配时发现这个问题,这样组合框将被禁用,用户无法调用无效查询,从而让最终用户知道该字段没有可用数据。

例如,我想要这样的东西:

Private Sub UpdateComboRows(src as String)
On Error Goto InvalidQueryError
    cmbBox.RowSource = "SELECT [colName] FROM [dBase III;DATABASE=K:\" & src & "].[tblName];"
    ' Something here to invoke RowSource query and throw error
    cmbBox.Enabled = True
Exit Sub

InvalidQueryError:
    cmbBox.RowSource = ""
    cmbBox.Enabled = False
End Sub

或者使用 if-then 语句的东西。

问题

是否有任何“流畅”的方法,或者我是否坚持尝试填充虚拟 DAO 记录集?除了 Dropdown 事件之外,还有什么方法可以调用 Combobox RowSource 查询吗?

4

1 回答 1

0

为什么不退后一步,先用 Dir 检查数据库是否存在,然后检查该列是否存在于函数中。很粗略。

Function IsDBOk() As Boolean
   On Error GoTo Err_Trap

   ''The default for boolean is false, so 
   ''IsDBOK=False at this point

   sFile=Dir("K:\" & src)

   If sFile<>"" Then
      Dim rs As DAO.Recordset
      Set rs = CurrentDB.OpenRecordset("SELECT [colName] " _
          & "FROM [dBase III;DATABASE=K:\" _
          & src & "].[tblName];")
      If Not rs.Eof() Then
          ''The selection is only okay if the recordset 
          ''contains records, however, you could return
          ''a different error for each problem
          ''file missing, column missing, empty recordset
          IsDBOk = True
      End If
   End If

   Exit Function

   Err_Trap:
     ''A missing column will give error 3061
     ''IsDBOk is already set to false
End Function
于 2012-07-12T22:12:28.623 回答