【问题标题】:ADODB RecordSet RecordCount doesn't return useful informationADODB RecordSet RecordCount 不返回有用信息
【发布时间】:2014-10-07 00:16:24
【问题描述】:

我的代码中有一个非常基本的存储过程执行:

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 记录。我有另一段代码可以返回单行或多行,使用我的测试参数,它返回七行,RecordCount 正确显示 7。有谁知道为什么我得到不一致的结果?如果我在这里得到零结果,我需要能够跳过后续的一段代码,并且没有其他好的检查方法,除了尝试访问错误的 RecordSet 对象并对resume next 使用特殊处理程序(如果它是特定的)错误代码。

【问题讨论】:

    标签: sql vb6 adodb


    【解决方案1】:

    如果您的strConnection 指定了只进游标,那么记录计数将始终为-1,因为无法通过这种连接识别结果大小。

    从这里http://msdn.microsoft.com/de-de/library/windows/desktop/ms676701(v=vs.85).aspx

    Recordset 对象的游标类型影响 记录可以确定。 RecordCount 属性将返回 -1 只进游标;静态或键集游标的实际计数; 以及 -1 或动态游标的实际计数,具体取决于 数据源。

    【讨论】:

    • 好吧,我会的。我对两者都使用了相同的连接字符串,但是在尝试解决另一个问题时,我在第二种情况下添加了objConn.CursorLocation = adUseClient 行。将在几分钟内接受。谢谢!
    【解决方案2】:

    确保在您的存储过程GetTemplate 中,您已启用行计数。

    例子:

    CREATE procedure [dbo].[GetTemplate] 
    AS
    BEGIN
        SET NOCOUNT OFF -- Enable row count here
        ...
    
    END
    

    【讨论】:

    • 有什么理由不包括SET NOCOUNT OFF这行吗?它会产生问题吗?只是想知道为什么它不是默认设置。
    • 启用no count 会更快、更高效(尤其是在您运行数千次查询并且并不真正关心受影响的行数的情况下。)但是如果您这样做了关心结果,那么你需要将no count设置为关闭。
    • 嗯,我可以在不包括该行的存储过程中获取记录数。
    • 该选项默认禁用。我的回答仅适用于您错误地将属性设置为SET NOCOUNT ON
    • 我也可以在存储过程中使用SET NOCOUNT ON 行获取记录数,这就是我在原始问题中提到的第二个SP 中的情况。
    【解决方案3】:

    将 FindRecordCount 调暗为整数

    如果 rsTemplate.EOF 那么 查找记录计数 = 0 别的 rsTemplate.MoveLast FindRecordCount = rstRecords.AbsolutePosition 结束如果

    也许你可以试试这样的东西

    【讨论】:

    • 是的,这可能行得通,但我很高兴RecordCount 本身可以正常工作。
    • 我认为它按预期工作。再次“当 ADO 无法确定记录数或提供程序或游标类型不支持 RecordCount 时为 -1”。只需创建一个替换 recordCount 的函数。
    • 好吧,我的代码添加了我在对另一个答案的评论中提到的行。
    猜你喜欢
    • 1970-01-01
    • 2016-08-13
    • 1970-01-01
    • 2016-06-15
    • 1970-01-01
    • 2016-02-12
    • 1970-01-01
    • 2016-10-10
    • 2016-01-14
    相关资源
    最近更新 更多