我正在编写一个将recordset
(从ADODB
库中)的内容复制到另一个函数。具体将Oracle g11
(其片段)的某些内容复制到Access 2007
。
因为我想确保只写全部内容或不写任何内容,我正在检查每个Fields
的recordset
是否相同(Name
和Type
相同)。
问题是我很快就偶然发现了一个案例,一个记录集的字段类型为adVarChar
,另一个记录集的字段为adVarWChar
。老实说,我不确定这些数据类型有什么不同,但是据我了解,它们都代表可变长度字符字段,如果我错了,请更正我,但我应该能够将adVarChar
的内容写入adVarWChar
。
现在,我了解到ADODB
可以识别的字符串类型更多,并且有很多类型的整数,双精度数,浮点数……您都明白了。
所以我的问题是如何检测是否可以将一种数据类型(ADODB
的数据类型)的内容写入/强制/转换为另一种?
是否有一种简便且DRY的方法?
请参阅我的代码以供参考
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
我之前已经完成过将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