【问题标题】:VbScript ADODB.RecordSet RecordCount returns -1VbScript ADODB.RecordSet RecordCount 返回 -1
【发布时间】:2019-02-12 02:08:49
【问题描述】:

我今天的问题是一个相当简单的问题。我所拥有的是一个 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

现在我在这里要做的是这个记录集对象中包含的记录数。现在我对这个类做了一些研究,发现有一个 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 或动态游标的实际计数。

注意:调用此属性时必须打开 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

【问题讨论】:

    标签: vbscript


    【解决方案1】:
    1. 由于您的 rs.RecordCount > 0 只是检查记录集是否不为空,您可以通过测试 Not rs.EOF 来避免 .Recordcount(以及所有问题)
    2. 不要相信二手资料; MS docs 包含“...以及 -1 或动态游标的实际计数,取决于数据源”。所以也许你的供应商是罪魁祸首。在这种情况下(或者当您确实需要特定号码时),SELECT COUNT() 将是一种解决方法
    3. 不要像rs.Open sSql, cn, 3, 3 那样使用幻数,而是定义(并仔细检查)您的常量,例如adOpenStaticadLockOptimistic、...

    【讨论】:

      【解决方案2】:

      来自帮助

      Set oRs = New ADODB.Recordset
      oRs.CursorLocation = adUseClient
      oRs.Open sSQL, sConn, adOpenStatic, adLockBatchOptimistic, adCmdText
      

      什么是光标(ADODB 程序员指南 - Windows 软件开发工具包)中有对光标的完整描述。

      您将在本地或服务器上刻录资源以获取记录数。无论如何,如果您要查看数据,只需计算它们。

      这是一次遍历一个记录集的方法。

          Do While not .EOF
              Outp.writeline .Fields("Txt").Value
              .MoveNext
          Loop
      

      【讨论】:

        【解决方案3】:
        Set connection = CreateObject("adodb.connection") 
        connection.open "Driver=your driver details"
        
        If connection.State = 1 Then
            Set myRecord = CreateObject("ADODB.recordset")
            sql= "select * from...."
            myRecord.Open sql, connection
            i = 0
            Do While Not myRecord.EOF
                i=i+1
                myRecord.MoveNext
            loop
            msgbox "RecordCount="&i
            myRecord.Close
        END IF   
        set myRecord = nothing
        set Connection = nothing
        

        【讨论】:

        • 鉴于 .Recordcount 和 SELECT COUNT() 这个手动的繁琐甚至一点都不荒谬。
        【解决方案4】:

        我发现它的 vbscript 版本很不稳定...最好的选择似乎使用 3 的 CursorLocation.. vbscript 似乎不理解 adUseClient。

        
            set conn=CreateObject("ADOdb.connection") 
            conn.CursorLocation = 3
            conn.open DSNQ
            set rs = conn.execute("select * from sometable order by 1 desc")
            msgbox (rs.RecordCount & " records"     )```
        

        【讨论】:

          猜你喜欢
          • 2011-01-17
          • 2016-02-12
          • 2018-12-09
          • 2012-12-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-24
          相关资源
          最近更新 更多