adodb 记录计数返回错误值

Posted

技术标签:

【中文标题】adodb 记录计数返回错误值【英文标题】:adodb recordcount returning wrong values 【发布时间】:2012-09-22 05:44:50 【问题描述】:

我正在使用以下代码查询 excel 以获取符合特定条件的行:

For i = 90 To Worksheets("My Sheet").Range("E65536").End(xlUp).Row
' This for loop is to iterate through the list of dates in the excel sheet
Value = Worksheets("My Sheet").Range("E" & i).Value - #1/1/1900# + 2
'Using the above line i am converting the date i want to filter the date 
 'into numeric
strQuery = "SELECT * FROM [My another sheet$A3:I" & LastRow & "] WHERE [Date1]< " &
Value & " AND ([somefield] = 'dog' or [somefield] = 'cat')"
    ' Here in the SQL query i am trying to see how many cats and dogs are satisfying with my date criteria
    Set rs = New ADODB.Recordset
        With rs
            .ActiveConnection = cn
            .Source = strQuery
            .CursorType = adOpenDynamic
            .CursorLocation = adUseClient
            .LockType = adLockOptimistic
            .Open
        End With


' Executing the select query on excel as database using ADODB api
    If rs.RecordCount = 0 Then        
        Else
            rs.MoveLast        
    End If
 Worksheets("My Sheet").Range("F" & i).Value = rs.RecordCount
 rs.Close
 ' Moving to the next date in the list
Next

我有类似这样的数据

    01/01/2012 狗A 02/01/2012 猫 B 03/01/2012 猫 C 04/01/2012 大鼠 D 05/01/2012 猫 E 06/01/2012 鹦鹉 F

我的名单上有这样的日期

    12/31/2010 - 在这里我必须找出有多少只猫和狗 从日期小于此日期的商店购买 12/31/2011 - 在这里我必须找出有多少只猫和狗 从日期小于此日期的商店购买

for 循环的目的是遍历这些日期并修改选择查询 这是我从上述代码中收到的值

32 35 37 44 57 64 71 78 84 86 89 91 91 但我应该得到这些值 32 36 37 47 57 66 73 81 84 89 90 91 91 我在某处读到过,我们应该在使用记录计数属性之前发出命令rs.movelast,但它仍然在某些迭代中显示错误的结果..

是不是因为循环和我使用的是同一个记录集。

我知道计数应该是的原因是因为我刚刚对 excel 列进行了相同的过滤,它显示的计数不同

列中的数据类型没有变化,即每列从头到尾都有相同的数据结构

请帮帮我。

我希望问题很清楚。如果需要更多详细信息,请告诉我。

【问题讨论】:

我看到你的投票很接近,我并不感到惊讶,因为我也无法弄清楚你在做什么。什么是 For ... Next 循环? LastRow 来自哪里?你的数据是在不同的情况下吗?你所有的约会都好吗?你怎么知道计数应该是多少? 对不起。为问题添加了更多细节。 对所有这些戏剧感到抱歉..我刚刚意识到,当我在 Excel 中进行过滤时,我选择的条件小于或等于..但是在选择相等条件时缺少..谢谢大家..我不知道如何结束这个问题。 【参考方案1】:

试试这个。它消除了循环。 Sheet7 有日期列表,Sheet8 有数据。

Sub groupbydate()
    sSQL = "TRANSFORM Count(b.Dates) AS CountOfDates " _
    & "SELECT 'Total' AS Total " _
    & "FROM [Sheet7$] a, [Sheet8$] b " _
    & "WHERE b.Animal In ('cat','dog') " _
    & "AND b.[dates]<=a.[dates] " _
    & "GROUP BY 'Total' " _
    & "PIVOT a.Dates"

    strFile = ActiveWorkbook.FullName

    strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strFile _
        & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"

    ''Late binding, so no reference is needed

    Set cn = CreateObject("ADODB.Connection")
    Set rs = CreateObject("ADODB.Recordset")

    cn.Open strCon

    rs.Open sSQL, cn, 3, 3

    For i = 1 To rs.Fields.Count
        Worksheets("Sheet8").Cells(1, 5 + i) = rs.Fields(i - 1).Name
    Next
    Worksheets("Sheet8").Cells(2, 6).CopyFromRecordset rs

    ''Tidy up
    rs.Close
    Set rs = Nothing
    cn.Close
    Set cn = Nothing

End Sub

【讨论】:

以上是关于adodb 记录计数返回错误值的主要内容,如果未能解决你的问题,请参考以下文章

如何从 adodb 记录集中访问存储过程中的变量?

每天计数返回错误值

SQL:计算每个设备集连续出现相同值的所有记录并返回最高计数

SQL:计算每个设备集连续出现相同值的所有记录并返回最高计数:百分比

在 django 中使用过滤计数而不是连接表返回错误值

apache在发布请求时返回403错误,输入变量计数保持不变,值发生变化