2

我正在构建一个带有一组支持子函数的函数来创建 ADOX.Catalog 对象,以帮助我构建 Access 数据库生成的自动化。

我喜欢为我的应用程序使用后期绑定,因为我的用户群并不总是拥有相同版本的办公应用程序,所以我不能总是依赖他们拥有我正在调用的相同版本的库。

我的公共函数接受多个对象作为参数,但在开始处理它们之前,我需要确保它们实际上是 ADODB.Recordset 对象。我参考了https://msdn.microsoft.com/en-us/library/s4zz68xc.aspx上的 msdn 文章以开始使用,我正在尝试If TypeOf ... Is ADODB.Recordset按照文章的建议使用,但它会产生以下错误:

Compile error:
User-defined type not defined

这是我的代码片段。第一个违规行是TypeOf adoRsColumns Is ADODB.Recordset

Public Function ADOX_Table_Factory( _
ByVal strTblName As String, _
Optional ByVal adoRsColumns As Object, _
Optional ByVal adoRsIndexes As Object, _
Optional ByVal adoRsKeys As Object _
) As Object

'Init objects/variables.
Set ADOX_Table_Factory = CreateObject("ADOX.Table")

'Begin interactions with the new table object.
With ADOX_Table_Factory
    .Name = strTblName

    'Check if we've received an ADO recordset for the column(s).
    If TypeOf adoRsColumns Is ADODB.Recordset Then
        'Check that the recordset contains rows.
        If Not (adoRsColumns.BOF And adoRsColumns.EOF) Then
            'Loop through the column definitions.
            Do
                .Columns.Append ADOX_Column_Factory(adoRsColumns.Fields(0), adoRsColumns.Fields(1), adoRsColumns.Fields(2), adoRsColumns.Fields(3))
            Loop Until adoRsColumns.EOF
        End If
    End If

我的谷歌搜索没有产生任何帮助我解决这个错误的结果。如果我设置对 ADO 库的引用,我已经确认此代码有效。我还通过该TypeName函数确认了对象的名称标识为Recordset. 但是,如果我替换TypeOf adoRsColumns Is ADODB.RecordsetTypeOf adoRsColumns Is Recordset,则测试评估为 false 并且不会执行所需的代码。我没有对TypeName' 的输出进行字符串比较,因为正如 MSDN 文章中所述,TypeOf ... Is它更快。

提前感谢您的任何帮助!

4

1 回答 1

1

回顾一下,如果您的项目中没有包含 ADO 引用,您会在此行收到编译错误:

If TypeOf adoRsColumns Is ADODB.Recordset Then

没有引用,VBA 不识别ADODB.Recordset 情况基本上和你试图在Dim rs As ADODB.Recordset没有引用的情况下声明一样。该声明将触发相同的编译错误。

没有引用就无法ADODB.Recordset用作可识别的类型。

ADODB.Recordset作为一种替代方法,您可以创建一个自定义函数来检查对象是否支持在 an 中可用但在 a 中不可用的方法或属性DAO.Recordset

这个检查记录集是否包含Supports方法。该方法在 an 中可用,ADODB但不在DAO Recordset.

Public Function IsAdoRecordset(ByRef pObject As Object) As Boolean
    Const adAddNew As Long = 16778240
    Dim lngTmp As Long
    Dim blnReturn As Boolean
    Dim strMsg As String

On Error GoTo ErrorHandler

    blnReturn = False
    If TypeName(pObject) = "Recordset" Then
        lngTmp = pObject.Supports(adAddNew)
        blnReturn = True
    End If

ExitHere:
    On Error GoTo 0
    IsAdoRecordset = blnReturn
    Exit Function

ErrorHandler:
    Select Case Err.Number
    Case 438  ' Object doesn't support this property or method
        ' leave blnReturn = False
    Case Else
        ' notify user about any other error
        strMsg = "Error " & Err.Number & " (" & Err.Description _
            & ") in procedure IsAdoRecordset"
        MsgBox strMsg
    End Select
    Resume ExitHere

End Function
于 2015-06-15T15:58:23.990 回答