VbScript ADODB.RecordSet RecordCount returns -1
VbScript ADODB.RecordSet RecordCount returns -1
我今天的问题比较简单。我拥有的是一个 VB 模块,其中包含 return 我的代码 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 returns -1。我发现这篇文章 http://www.w3schools.com/asp/prop_rs_recordcount.asp 指出记录计数将 return -1 对于以下内容:
注意:对于只进游标,这个 属性 将 return -1;静态或键集游标的实际计数;和 -1 或动态游标的实际计数。
注意:调用此 属性 时必须打开 Recordset 对象。如果不支持此 属性 它将 return -1.
如何让这个对象达到 return 正确的记录数??
下面添加了 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
中那样使用幻数,而是像 adOpenStatic
、adLockOptimistic
、... 那样定义(并仔细检查)你的常量
来自帮助
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
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
我发现它的 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" )```
我今天的问题比较简单。我拥有的是一个 VB 模块,其中包含 return 我的代码 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 returns -1。我发现这篇文章 http://www.w3schools.com/asp/prop_rs_recordcount.asp 指出记录计数将 return -1 对于以下内容:
注意:对于只进游标,这个 属性 将 return -1;静态或键集游标的实际计数;和 -1 或动态游标的实际计数。
注意:调用此 属性 时必须打开 Recordset 对象。如果不支持此 属性 它将 return -1.
如何让这个对象达到 return 正确的记录数??
下面添加了 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
中那样使用幻数,而是像adOpenStatic
、adLockOptimistic
、... 那样定义(并仔细检查)你的常量
来自帮助
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
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
我发现它的 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" )```