【问题标题】:VBA ADODB test is two fields are convertable?VBA ADODB测试两个字段是否可以转换?
【发布时间】:2017-03-27 22:43:33
【问题描述】:

我正在编写一个将recordset(来自ADODB 库)的内容复制到另一个的函数。特意将Oracle g11的部分内容(其中的片段)复制到Access 2007

因为我想确保我写的是所有内容或根本不写 - 我正在检查每个 recordsetFields 是否相同(具有相同的 NameType)。

问题是我很快就偶然发现了一个案例,一个记录集的字段类型为adVarChar,而另一个记录集的字段类型为adVarWChar。老实说,我不确定这些数据类型有何不同,但据我所知,它们都表示可变长度字符字段,如果我错了,请纠正我,但我应该能够将 adVarChar 的内容写入 adVarWChar .

现在我明白了ADODB 可以识别的字符串类型还有很多,而且整数、双精度、浮点数的类型也很多......你明白了。

所以我的问题是如何检测您是否可以将一种数据类型(ADODB 的数据类型)的内容写入/强制/转换为另一种?

有没有一种持续且干燥的方法来做到这一点?

查看我的代码以供参考

Sub AppendRecords(NewRecords As ADODB.Recordset, OriginalRecords As ADODB.Recordset)
    Dim AllFieldsMatch As Boolean
    Dim Iterator       As Integer
    Dim ActiveField    As Field
    Dim FieldCount     As Integer
    Dim FieldNames()   As String
    Dim FieldValues()  As Variant

    FieldCount = NewRecords.Fields.Count

    For Iterator = 0 To FieldCount - 1
        If NewRecords.Fields(Iterator).Name <> OriginalRecords.Fields(Iterator).Name Then
            AllFieldsMatch = False
            Err.Raise 10001, "AppendRecords", "Field names are not matching."
        End If
    Next

    For Iterator = 0 To FieldCount
        If NewRecords.Fields(Iterator).Type <> OriginalRecords.Fields(Iterator).Type Then
            AllFieldsMatch = False
            Err.Raise 10002, "AppendRecords", "Field Types are not matching."
        End If
    Next
    If NewRecords.EOF And NewRecords.BOF Then
        Err.Raise 10003, "AppendRecords", "There are no records in new Recordset."
    End If

    Iterator = 0
    ReDim FieldNames(Iterator To FieldCount - 1)
    ReDim FieldValues(Iterator To FieldCount - 1)

    For Each ActiveField In NewRecords.Fields
        FieldNames(Iterator) = ActiveField.Name
    Next

    While Not NewRecords.EOF
        For Each ActiveField In NewRecords.Fields
            FieldNames(Iterator) = ActiveField.Value
        Next

        OriginalRecords.AddNew FieldNames, FieldValues

        NewRecords.MoveNext
        'LogCompletedJob "GetCoverageTable"  'Ignore for now
    Wend
End Sub

【问题讨论】:

    标签: vba ms-access oracle11g ado adodb


    【解决方案1】:

    我之前已经将 ADO 字段数据类型映射到 DAO 字段数据类型。但是我还没有用 Oracle 做到这一点。此链接可能会有所帮助:

    https://docs.oracle.com/cd/B19306_01/server.102/b14232/apb.htm

    或者这个:

    https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/oracle-data-type-mappings

    您可以尝试在不检查数据类型的情况下更新字段值。添加错误处理以捕获明显的失败,然后比较两个字段值的内容以查看数据是否通过。

    即删除这个:

    For Iterator = 0 To FieldCount
        If NewRecords.Fields(Iterator).Type <> OriginalRecords.Fields(Iterator).Type Then
            AllFieldsMatch = False
            Err.Raise 10002, "AppendRecords", "Field Types are not matching."
        End If
    Next
    

    并在这部分代码中添加错误处理/检查:

    For Each ActiveField In NewRecords.Fields
        FieldNames(Iterator) = ActiveField.Value
    Next
    

    【讨论】:

      猜你喜欢
      • 2010-12-01
      • 2010-09-28
      • 1970-01-01
      • 2013-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多