ADODB记录集记录计数始终返回-1

时间:2017-09-09 10:12:19

标签: vba excel-vba ms-access excel

我正在尝试将数据检索到excel,形成MS访问中的数据库。但是,记录集的recordcount属性总是返回-1,但出于其他目的,代码工作正常。

我使用的代码如下:     `Sub datarecordset()

l_n.pack()
l_t.pack()

def validate(name):
    global v1,v2,n,t
    if name=='l_n':
        v1=True
        s=l_n.get()
        n=int(s)
        l_n.delete(0,END)
    elif name=='l_t':
        v2=True
        s=l_t.get()
        t=float(s)
        l_t.delete(0,END)
    if v1==True and v2==True:
        b1.config(state=NORMAL)

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

我在google上搜索并了解我需要声明记录集类型,为此我必须使用connection.open代替connection.execute。但我试图更改代码,然后它给出错误对象变量或未定义变量。

欢迎任何快速帮助。感谢。

3 个答案:

答案 0 :(得分:3)

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

Set oRS = CreateObject("ADODB.Recordset")
oRS.CursorLocation = adUseClient
oRS.Open sSQL, cn
当ADO无法确定记录数或者提供者或游标类型不支持RecordCount时,

ADO的recordcount属性返回-1。对于这种情况,最后一个是正确的。

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

答案 1 :(得分:1)

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

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

  • 其余的都可以。

  • 1-RS。打开SqlStr,Conn

  • 2-RS.Open SqlStr,Conn,adOpenDynamic

(Erik的解决方案)  -3-RS.CursorLocation = adUseClient

其他选项也可以正常工作,请注意4和6-不需要单独的行  -4-RS.Open SqlStr,Conn,adOpenKeyset
 -5-RS.Open SqlStr,Conn,adOpenKeyset和RS.CursorLocation = adUseClient
 -6-RS.Open SqlStr,Conn,adOpenStatic和RS.CursorLocation = adUseClient
 -7-RS.Open SqlStr,Conn,adOpenStatic

BR,Çağlar

答案 2 :(得分:0)

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

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

关闭记录集,更改游标类型并重新打开记录集对我来说很好(在Windows 7上为Access 2016)。