我尝试并且无法编辑我用SQL填充的ADODB记录集中的记录(Original Question。所以我决定采用旧式(且效率低下)的方式并将记录集复制到新的记录集上按记录记录。
我首先将字段属性设置为相等(数据类型和大小),因为我想确保获得正确的数据匹配。但是,我遇到两个错误:
“不可为空的列无法更新为空”
和
“多步操作产生错误。检查每个状态值”
(这正是我试图通过循环来避免的!)
以下是代码:
'Create recordset
Set locRSp = New ADODB.Recordset
'Copy fields (same data type, same size and all updateable (which is the final goal)
For Each Field In locRS.Fields
locRSp.Fields.Append Field.Name, Field.Type, Field.DefinedSize, adFldUpdatable
Next
'Copy records
locRSp.Open
locRS.MoveFirst
'Loop original recordset
Do While Not locRS.EOF
locRSp.AddNew
'Loop all fields
For Each Field In locRS.Fields
locRSp.Fields(Field.Name) = locRS.Fields(Field.Name)
Next
locRS.MoveNext
Loop
我不明白的是:
如果我要复制原始字段属性(大小和类型),为什么会出现数据错误!?
我需要看一些其他属性吗?怎么样?
答案 0 :(得分:0)
对于第一个问题:简单地说,如果要存储Null值,则需要将属性设置为“adFldIsNullable”
因此,对于我的示例,我将追加调用更改为:
locRSp.Fields.Append Field.Name, Field.Type, Field.DefinedSize, adFldIsNullable
对于第二个问题:当查询下载到原始记录集时,我会根据数据本身设置字段属性。但是在这种情况下,我逐个调查那是什么,发现问题列设置为:
数据类型adNumeric
需要定义精度和比例。精度是你想要的位数,而scale是小数位数
所以在我的情况下,我在循环中添加了一个复制字段的IF:
If Field.Type = 131 Then '131 is the constant value for adNumeric
'Define Scale
locRSp.Fields(Field.Name).NumericScale = 0
'Define Precision
locRSp.Fields(Field.Name).Precision = 4
End If