ADODB记录的RecordCount不返回有用的信息
我有一个存储过程的一个非常基本的执行在我的代码:ADODB记录的RecordCount不返回有用的信息
Dim objCmd As ADODB.Command
Dim objConn As ADODB.Connection
Dim rsTemplate As ADODB.Recordset
Set objConn = New ADODB.Connection
objConn.Open strConnection
Set objCmd = New ADODB.Command
objCmd.ActiveConnection = objConn
objCmd.CommandType = adCmdStoredProc
objCmd.CommandText = "GetTemplate"
objCmd.Parameters.Append objCmd.CreateParameter("@Param1", adInteger, adParamInput, , lngParam1)
objCmd.Parameters.Append objCmd.CreateParameter("@Param2", adInteger, adParamInput, , lngParam1)
objCmd.CommandTimeout = 600
Set rsTemplate = objCmd.Execute()
LogInfo "Found " & rsTemplate.RecordCount & " templates"
的SP应该找到一个单行。问题是,有时它没有罚款,这实际上是可以的,只是在两种情况下RecordCount
属性都是-1。我会期望0记录为零,1记录为1。我有另一段代码,可以返回一个或多个行,并与我的测试参数,它返回七行,RecordCount
正确显示7.有谁知道为什么我得到不一致的结果?如果我在这里得到零结果,我需要能够跳过后面的一段代码,除了试图访问一个坏的RecordSet对象并且有一个特殊的处理程序到resume next
,如果它是一个特定的错误代码,没有其他好方法来检查。
如果你的strConnection
是这样的,你只是指定一个只进游标,那么记录数将始终为-1
,因为结果大小不能用这种连接来标识。
从这里http://msdn.microsoft.com/de-de/library/windows/desktop/ms676701(v=vs.85).aspx
的记录对象的光标类型会影响是否能够确定的 记录数。 RecordCount属性将返回-1为 一个只进游标;静态或键集游标的实际计数; 以及-1或动态游标的实际计数,具体取决于数据源 。
暗淡FindRecordCount作为整数
如果rsTemplate.EOF然后 FindRecordCount = 0 否则 rsTemplate.MoveLast FindRecordCount = rstRecords.AbsolutePosition 结束如果
也许你可以尝试这样的事情
是的,这可能会起作用,但我很高兴让'RecordCount'本身正常工作。 – 2014-10-06 16:10:45
我认为它按预期工作。再次“-1,当ADO无法确定记录的数量或提供者或游标类型不支持RecordCount时”。只需创建一个替换recordCount的函数。 – trixrabbit 2014-10-06 16:14:10
那么我的代码工作添加我在其他答案的评论中提到的行。 – 2014-10-06 16:15:16
确保在存储过程GetTemplate
中启用了行计数。
例子:
CREATE procedure [dbo].[GetTemplate]
AS
BEGIN
SET NOCOUNT OFF -- Enable row count here
...
END
你有什么理由不加入'SET NOCOUNT OFF'这行吗?它会产生问题吗?只是想知道为什么它不是默认设置。 – 2014-10-06 16:17:46
启用'no count'会更快更高效(特别是如果您运行查询数千次,并且不关心受影响的行数)。但是如果您关心结果,那么你需要将'no count'设置为关闭。 – 2014-10-06 16:20:52
嗯,我能够在存储过程中不包括该行的情况下获得记录数。 – 2014-10-06 16:30:01
嗯,我会。我为两者使用了相同的连接字符串,但在尝试解决另一个问题时,我在第二种情况下添加了“objConn.CursorLocation = adUseClient”这一行。将在几分钟内接受。谢谢! – 2014-10-06 16:03:03