代码之家  ›  专栏  ›  技术社区  ›  ANAND AGRAWAL

ADODB recordset recordcount始终返回-1

  •  3
  • ANAND AGRAWAL  · 技术社区  · 7 年前

    我试图在MS access中从数据库中检索excel数据。然而,记录集的recordcount属性始终返回-1,尽管出于其他目的,代码工作正常。

    `子数据记录集()

    Dim cn As adodb.Connection
    Dim oRs As adodb.Recordset
    Set cn = CreateObject("ADODB.Connection")
    DBPath = "C:\[databse path]" & "\[database name].accdb"
    dbWs = "[excel sheet name]"
    scn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & DBPath
    dsh = "[" & "[excel sheet name]" & "$]"
    cn.Open scn
    Dim sSQL As String
    
    Dim F As Integer
    
    sSQL = "Select 'W',a.[Subledger],NULL,sum(a.[Amount]) from GL_Table a where a.[Opex_Group] = 10003 and year(a.[G/L Date]) = " & Year(Sheets("Repairs").Cells(1, 4)) & " and month(a.[G/L Date]) = " & Month(Sheets("Repairs").Cells(1, 4))
    sSQL = sSQL & " group by " & "a.[Subledger],(year(a.[G/L Date])),(month(a.[G/L Date]))"
    Set oRs = cn.Execute(sSQL)
    Debug.Print oRs.RecordCount
    oRs.Close
    ....... further code to print to excel here
    
    cn.Close
    End Sub`
    

    代码将在记录集中获取数据并在excel中写入。但由于recordset属性不返回recordcount,因此无法将记录集中各个字段的值打印到excel工作表的不同单元格。

    欢迎任何快速帮助。谢谢

    3 回复  |  直到 6 年前
        1
  •  8
  •   Erik A    7 年前

    @BitAccesser的链接提供了有效的解决方案。如何在您的情况下快速实施: 而不是 Set oRs = cn.Execute(sSQL)

    Set oRS = CreateObject("ADODB.Recordset")
    oRS.CursorLocation = adUseClient
    oRS.Open sSQL, cn
    

    ADO 当ADO无法确定记录数或提供程序或游标类型不支持recordcount时,的recordcount属性返回-1。最后一个对这个案例是正确的。

    为了避免这种情况,有几种解决方案。最简单的方法是使用客户端游标,我刚刚演示过,但是@BitAccesser在链接中提供了更多替代解决方案

        2
  •  1
  •   Çağlar Durgun    5 年前

    您还可以指定CursorType作为第三个参数,以按如下方式打开记录集,这是可选的

    • 前两行(留空或选择adOpenDynamic)不提供记录计数。

    • 1-RS.Open SqlStr,连接

    • 2-RS.Open SqlStr,Conn,adOpenDynamic

    -3-RS.CursorLocation=adUseClient

    其他选项也可以,请注意4和6,它们不需要单独的行 -4-RS.Open SqlStr,Conn,adOpenKeyset


        3
  •  0
  •   Volker    5 年前

    您仍然可以使用Execute方法,但需要设置正确的游标类型。记录集是使用光标类型自动创建的 adOpenForwardOnly oRs.RecordCount = -1 . adOpenKeySet 正确显示的光标类型是否正确 oRs.RecordCount .
    注:The LockType 在这种情况下无关紧要。

    Set oRs = cn.Execute(sSQL)
    oRs.Close
    oRs.CursorType = adOpenKeyset
    oRs.Open
    Debug.Print oRs.RecordCount