我今天的问题很简单。我所拥有的是一个VB模块,其中包含向我返回一个ADODB.RecordSet对象的代码,该对象具有从已执行的SQL查询中获取的记录。它是这样的:

sSql_SerCheck = "SELECT DISTINCT Serial FROM dbo.WipReservedSerial WHERE  Serial LIKE '" & serialTempSearch
sSql_SerCheck = sSql_SerCheck & "' ORDER BY Serial DESC "
dbGetRecordSet(sSql_SerCheck)

然后将结果放在对象rs中,该对象按如下方式访问
 temp = rs(0) 'For the value at the first column for the first record
 rs.MoveNext  'This moves to the next record in the record set

现在,我要在这里执行的操作是记录集对象中包含的记录数。现在,我对该类(class)进行了一些研究,发现其中有一个
RecordCount att。

所以我想做的很简单:
if( rs.RecordCount > 0) then
    serCheck1 = rs(0)
    MsgBox serCheck1
end if

问题是我的RecordCount返回-1。我发现这篇文章http://www.w3schools.com/asp/prop_rs_recordcount.asp指出记录计数将为以下内容返回-1:

注意:对于仅向前的游标,此属性将返回-1;否则,该属性将返回-1。静态或键集游标的实际计数;和-1或动态游标的实际计数。

注意:调用此属性时,必须打开Recordset对象。如果不支持此属性,它将返回-1。

如何获得此对象以返回正确的记录数?

下面添加了VB模块的代码:
Public cn, rs


'Specify pSQL as SQL Statement
Function dbGetRecordset(sSql)
dbCloseConnection()

Set cn = CreateObject("ADODB.Connection")
cn.CommandTimeout = 600
cn.Open(Conn & SystemVariables.CodeObject.CompanyDatabaseName)
Set rs = CreateObject("ADODB.Recordset")
rs.Open sSql, cn, 3, 3
End Function

最佳答案

  • 由于您的rs.RecordCount > 0仅检查记录集是否为空,因此可以通过测试Not rs.EOF
  • 来避免.Recordcount(及其所有问题)
  • 不信任次要来源; MS docs包含“...,以及动态游标的-1或实际计数,具体取决于数据源”。因此,也许您的提供者应该受到指责。在这种情况下(或当您确实需要一个特定的数字时),SELECT COUNT()将是一种变通方法
  • 不要像rs.Open sSql, cn, 3, 3中那样使用魔数(Magic Number),而是像adOpenStaticadLockOptimistic,...
  • 一样定义(并仔细检查)您的Consts

    关于VbScript ADODB.RecordSet RecordCount返回-1,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28560897/

    10-11 15:30
    查看更多