两种Recordset创建方式的区别

代码1:
Local $oExcelConn = ObjCreate("ADODB.Connection") 
Local $connStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & $FilePath & ";Extended Properties=""Excel 12.0;HDR=YES;IMEX=1"""
$oExcelConn.Open($connStr)
Local $rs_Excel = $oExcelConn.Execute('SELECT * From [下线$] ')
代码2:
Local $oExcelConn = ObjCreate("ADODB.Connection")
Local $connStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & $FilePath & ";Extended Properties=""Excel 12.0;HDR=YES;IMEX=1"""
$oExcelConn.Open($connStr)
Local $rs_Excel = ObjCreate("ADODB.Recordset")
$rs_Excel.open('SELECT * From [下线$] ', $oExcelConn,$adOpenKeyset, $adLockReadOnly)两个代码有什么区别,代码1中的$rs_Excel是Recordset类型吗?

上面是autoit代码,两个代码中的$rs_Excel都是Recordset类型,但有一定的区别,区别如下:


在代码1中:


oExcelConn.Execute('SELECT * From [下线$]') 会直接通过 Connection 对象执行查询并返回一个 Recordset 对象。

由于 Execute 方法的默认行为,这种方式创建的 Recordset 是只读的、前向游标类型(adOpenForwardOnly),不支持在记录集中来回移动,也不允许对数据进行修改。

因此,$rs_Excel 是一个 Recordset 类型,但它的属性比较受限。

代码1 中,$oExcelConn.Execute 方法默认使用的是 前向游标(adOpenForwardOnly),它只能顺序向前读取记录。这种游标类型出于性能考虑,不支持计算总记录数,因此 RecordCount 返回 -1,表示无法获取记录数。




在代码2中:


$rs_Excel 是通过 ObjCreate("ADODB.Recordset") 显式创建的 Recordset 对象。

$rs_Excel.open(...) 方法使用了 adOpenKeyset 和 adLockReadOnly 参数来设置游标类型和锁定类型,提供更灵活的控制:

adOpenKeyset:允许在记录集中双向移动,且可见其他用户修改的记录。

adLockReadOnly:只读锁定,不允许修改记录。

代码2 中,通过手动创建 Recordset 对象并设置游标类型为 adOpenKeyset,这允许在记录集中双向移动,同时能够计算出记录集的实际记录数。因此,RecordCount 可以返回正确的记录数(32000)。


总结

代码1:$rs_Excel 是通过 Connection.Execute 方法创建的 Recordset,默认为只读且仅支持前向游标。

代码2:$rs_Excel 是手动创建的 Recordset,通过 open 方法指定游标类型和锁定模式,允许双向移动和自定义只读锁定。

代码2提供了更多控制和灵活性,特别是在数据访问方式上的自定义。

如果需要准确的 RecordCount 值,应使用支持双向移动的游标类型(如 adOpenKeyset 或 adOpenStatic),而不是默认的前向游标(adOpenForwardOnly)。在代码1中,若需要获取正确的记录数,可以尝试改用代码2的方式,手动创建 Recordset 并设置合适的游标类型。



打赏

本篇文章链接 地址:https://wmzos.com/?id=133

相关阅读

添加新评论