我正在尝试将数据检索到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。但我试图更改代码,然后它给出错误对象变量或未定义变量。
欢迎任何快速帮助。感谢。
答案 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
(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 = -1
。 adOpenKeySet
是正确显示oRs.RecordCount
的正确光标类型。
注意:在这种情况下,LockType
无关紧要。
Set oRs = cn.Execute(sSQL)
oRs.Close
oRs.CursorType = adOpenKeyset
oRs.Open
Debug.Print oRs.RecordCount
关闭记录集,更改游标类型并重新打开记录集对我来说很好(在Windows 7上为Access 2016)。