将 DAO 记录集转换为断开连接的 ADO 记录集 dbDecimal 问题

Posted

技术标签:

【中文标题】将 DAO 记录集转换为断开连接的 ADO 记录集 dbDecimal 问题【英文标题】:Converting DAO Recordset to Disconnected ADO Recordset dbDecimal Issue 【发布时间】:2012-05-27 01:47:29 【问题描述】:

在 MS Access VBA (2007) 中,我编写了以下函数来将 DAO 记录集转换为断开连接的内存中 ADO 记录集。问题是我在 DAO dbDecimal 字段上遇到了数据类型转换问题。当我尝试将 DAO 记录集中的数据插入到新创建的 ADO 记录集中时,就会出现问题。当我到达类型为 DAO dbDecimal (ADO adNumeric) 的列时,我收到以下错误:

Error -2147217887 (80040e21): 
Multiple-step operation generated errors. Check each status value.

我看过,每次到达此列时都会发生错误。此列包含的数据是简单的数字,例如 25、44、60 等。

正如您在下面看到的,我已经对我的 NumericScale 和 Precision 进行了硬编码,但这似乎没有任何帮助。

Public Function ConvertDAORStoADORS(ByRef r1 As DAO.Recordset) As ADODb.Recordset

    If Not r1 Is Nothing Then

        Dim ra As ADODb.Recordset
        Set ra = New ADODb.Recordset

        Dim f1 As DAO.Field, fa As ADODb.Field

        For Each f1 In r1.Fields
            Select Case f1.Type
                Case dbText
                    ra.Fields.Append f1.Name, adVarWChar, f1.Size, adFldIsNullable
                Case dbMemo
                    ra.Fields.Append f1.Name, adLongVarWChar, 10000, adFldIsNullable

                'Here's the problematic one
                Case dbDecimal
                    ra.Fields.Append f1.Name, adNumeric, , adFldIsNullable
                    Set fa = ra.Fields(f1.Name)
                    fa.NumericScale = 19
                    fa.Precision = 4

                Case 9, dbLongBinary, dbAttachment, dbComplexByte, dbComplexInteger, dbComplexLong, dbComplexText, dbComplexSingle, dbComplexDouble, dbComplexGUID, dbComplexDecimal
                    'Unsupported types
                Case Else
                    Debug.Print f1.Name & " " & f1.Type
                    ra.Fields.Append f1.Name, GetADOFieldType(f1.Type), , adFldIsNullable

            End Select
        Next f1
        ra.LockType = adLockPessimistic
        ra.Open
        'On Error Resume Next
        If Not (r1.EOF And r1.BOF) Then
            r1.MoveFirst
            Do Until r1.EOF = True
                ra.AddNew
                For Each f1 In r1.Fields
                    'Error -2147217887 (80040e21) Multiple-step operation generated errors. Check each status value.
                    'Error only occurs on dbDecimal/adNumeric fields
                    ra(f1.Name).value = r1(f1.Name).value
                Next f1
                ra.Update
                r1.MoveNext
            Loop
        End If

        Set ConvertDAORStoADORS = ra
    End If

End Function

Private Function GetADOFieldType(daofieldtype As Integer) As Long
    Select Case daofieldtype
        'Fixed width adWChar does not exist
        Case dbText: GetADOFieldType = adVarWChar
        Case dbMemo: GetADOFieldType = adLongVarWChar
        Case dbByte: GetADOFieldType = adUnsignedTinyInt
        Case dbInteger: GetADOFieldType = adSmallInt
        Case dbLong: GetADOFieldType = adInteger
        Case dbSingle: GetADOFieldType = adSingle
        Case dbDouble: GetADOFieldType = adDouble
        Case dbGUID: GetADOFieldType = adGUID
        Case dbDecimal: GetADOFieldType = adNumeric
        Case dbDate: GetADOFieldType = adDate
        Case dbCurrency: GetADOFieldType = adCurrency
        Case dbBoolean: GetADOFieldType = adBoolean
        Case dbLongBinary: GetADOFieldType = adLongVarBinary
        Case dbBinary: GetADOFieldType = adVarBinary
        Case Else: GetADOFieldType = adVarWChar
    End Select
End Function

我从链接到 MS SQL Server 2008 的 ODBC 链接表派生我的 DAO 记录集。该字段实际上是 SQL Server Decimal(19,4) 数据类型。

任何想法如何解决这个问题?

【问题讨论】:

【参考方案1】:

这对我有用,但我不确定你为什么不只是从表中创建 ADODB 记录集并断开它。

  Case dbDecimal
      ra.Fields.Append f1.Name, adDecimal, , adFldIsNullable
      Set fa = ra.Fields(f1.Name)
      fa.NumericScale = 19
      fa.Precision = 4

还有,为什么不呢

    Dim ra As New ADODb.Recordset
    ''Set ra = New ADODb.Recordset

【讨论】:

它也适用于我,但后来在将数据从 DAO 记录集移动到新创建的 ADO 记录集时出错。它总是在我的小数列上出错。 我的意思是当我使用上面的 adDecimal 而不是 adNumeric 时,它不会在小数列上出错,这就是你在代码中所拥有的。

以上是关于将 DAO 记录集转换为断开连接的 ADO 记录集 dbDecimal 问题的主要内容,如果未能解决你的问题,请参考以下文章

在 VBA 中执行 ADO 记录集命令会引发错误“转换 nvarchar 值时转换失败”

MS Access ADO 记录集和二维数组

MS Access ADP 断开连接的记录集恢复

在 VBA 中对断开连接的 ADODB 记录集应用过滤器

Javascript ADO 记录集打开方法不起作用。参数化查询

如何从 ADO 记录集字段将图片加载到 MS-Access Image 控件中?