我修改了一段以前写的 vba,用到了 recordset.clone,没想到由于 vba 本身的 bug,克隆并没有进行,recordset.clone 返回值仍然是原记录集的引用。我在返回值记录集进行了 recordset.delete,结果把我原本想保持不动的原记录集里的记录给删了。
那个恨啊!实在没想到 recordset.clone 只引用不克隆,害我为恢复原记录折腾了很久。我没兴趣深究原因,就当是 vba bug,就算是我调用参数配置不当,recordset.clone 克隆不成功也不能随随便便返回一个值而不抛出错误。
既然 recordset.clone 不能用,找了一个前辈 Robert Gelb 写的函数来做真正的克隆。
Public Function Clone(ByVal oRs As ADODB.Recordset, _
Optional ByVal LockType As ADODB.LockTypeEnum = adLockUnspecified) As ADODB.Recordset
Dim oStream As ADODB.Stream
Dim oRsClone As ADODB.Recordset
'save the recordset to the stream object
Set oStream = New ADODB.Stream
oRs.Save oStream
'and now open the stream object into a new recordset
Set oRsClone = New ADODB.Recordset
oRsClone.Open oStream, , , LockType
'return the cloned recordset
Set Clone = oRsClone
'release the reference
Set oRsClone = Nothing
End Function