Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 使用循环复制ADO记录集_Excel_Vba_Nullable_Adodb_Recordset - Fatal编程技术网

Excel 使用循环复制ADO记录集

Excel 使用循环复制ADO记录集,excel,vba,nullable,adodb,recordset,Excel,Vba,Nullable,Adodb,Recordset,我尝试编辑使用SQL填充的ADODB记录集中的记录,但失败。于是,我决定采用老式的低效方法,将记录集一张一张地复制到新的记录上 我首先将字段属性设置为相同的数据类型和大小,因为我希望确保获得正确的数据匹配。但是,我遇到了两个错误: 无法将不可为Null的列更新为Null 及 多步骤操作生成错误。检查每个状态值 这正是我试图通过循环来避免的 代码如下: 'Create recordset Set locRSp = New ADODB.Recordset 'Copy fields (same da

我尝试编辑使用SQL填充的ADODB记录集中的记录,但失败。于是,我决定采用老式的低效方法,将记录集一张一张地复制到新的记录上

我首先将字段属性设置为相同的数据类型和大小,因为我希望确保获得正确的数据匹配。但是,我遇到了两个错误:

无法将不可为Null的列更新为Null

多步骤操作生成错误。检查每个状态值

这正是我试图通过循环来避免的

代码如下:

'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
我不明白的是:

如果复制原始字段属性大小和类型,为什么会出现数据错误

我还需要看别的房子吗?如何处理?

对于第一个问题:简单地说,如果要存储空值,需要将属性设置为adFldIsNullable

因此,在我的示例中,我将append调用更改为:

locRSp.Fields.Append Field.Name, Field.Type, Field.DefinedSize, adFldIsNullable
对于第二个问题:当查询下载到原始记录集时,字段属性的设置取决于数据本身。但在本例中,我逐一调查了问题所在,发现问题列设置为:

数据类型adNumeric

需要定义精度和比例。其中,精度是所需的位数,小数位数是小数位数

因此,在我的例子中,我向复制字段的循环中添加了一个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