VbScript ADODB.RecordSet RecordCount返回-1

时间:2015-02-17 11:28:26

标签: vbscript

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

4 个答案:

答案 0 :(得分:5)

来自帮助

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

答案 1 :(得分:3)

  1. 由于您的rs.RecordCount > 0只是检查记录集是否为空,您可以通过测试Not rs.EOF
  2. 来避免.Recordcount(及其所有问题)
  3. 不要信任二手资料; MS docs包含" ...以及-1或动态光标的实际计数,取决于数据源"。所以也许你的提供者应该受到指责。在这种情况下(或者当您确实需要特定号码时),SELECT COUNT()将是一种解决方法
  4. 不要使用rs.Open sSql, cn, 3, 3中的幻数,而是定义(并双重检查)您的Consts,例如adOpenStaticadLockOptimistic,......

答案 2 :(得分:1)

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

答案 3 :(得分:0)

我发现它的vbscript版本很不稳定...最好的选择似乎是使用CursorLocation为3。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"     )```