51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 2368|回复: 3
打印 上一主题 下一主题

[原创] recordset连接数据库后查询结果为空系统就报'General run error'

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2010-9-15 19:35:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这段脚本其实就是想判断一下datatable中的值是否已经存在于数据库中,但是当recordset的查询结果为空时系统就会报错,也就是当datatable中的值在数据库中不存在时就报错,不知道问题出在哪里,还请熟悉recordset对象的大虾帮忙看看,谢了

Dim Qname, RowCount, rec,sql, cnn, RowID,childrec
RowCount=datatable.GetSheet(2).GetRowCount
For i=1 to RowCount
        datatable.SetCurrentRow(i)
        Qname=datatable.Value("Query_Name","All Queries")
        Set cnn=createobject("adodb.connection")
        Set rec=createobject("adodb.recordset")
    cnn.C                                     //这行就是给连接字符串赋值,但是帖子上怎么也显示不出来,大家知道这个意思就行了
    cnn.Open
    sql="select distinct (query_name) from query where query_name='"&Qname&"'"
    rec.Open sql,cnn,1,3
     //msgbox rec(0)                     //为了查一下执行到第二个循环时recordset中的返回值,所以就加了个msgbox, 但是调试时发现从这句就报general run error的
                                                  //错误了
         If Qname<>rec(0) Then    //在datatable中我只设了两行数据,第一行在数据库中已经存在了,第二行没有,执行第一个循环时没
                                                  //问题,执行到第二个循环,也就是当rec中没有返回值时就报错了,也是'general run error'
               RowID=i                                    
               msgbox RowID
               Exit for
           else
               msgbox "This Active Query has already existed in the DataBase"
        end if
            
   ' For each childrec in rec         //这段代码想实现的功能跟上边一样,但是执行到for each in时系统报错说不支持这种属性或方法,所以就换成上面的那种实现
                                                   // 方法了,大家能帮我看看是什么原因么?

     ' If Qname=childrec Then
        '            msgbox "This Active Query has already existed in the DataBase"
        '        else RowID=i
        '                   msgbox RowID
        '                   exit  for
         '   End If
        'Next
    rec.Close
    Set rec=nothing
    cnn.Close
    Set cnn=nothing
Next

[ 本帖最后由 lmwangwang 于 2010-9-16 10:27 编辑 ]
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

2#
 楼主| 发表于 2010-9-16 09:58:32 | 只看该作者
怎么没人回帖呢?是不是问题表述的不清楚啊 换句话说,如果recordset集合中没有数据是不是等于recz(0)=null 或" " 呢? 还是说recordset这个集合不允许为空?我查了一下,没有找到相关说明,熟悉recordset的大牛出来指点一下吧~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

3#
发表于 2010-9-16 09:59:55 | 只看该作者
rec.Fields("zzz")
rec.Fields(0)

do while not rec.EOF
loop
回复 支持 反对

使用道具 举报

该用户从未签到

4#
 楼主| 发表于 2010-9-16 10:26:39 | 只看该作者
谢谢skyzhu~~~
我刚才写回帖的时候突然想到把那句判断返回值是否等于datatable中的值变成直接判断recordset中是否为空,用if recordset.eof or recordset.bof then, 结果调试通过了,楼上用的field方法我再去看看帮助手册,学习下。我之前也用过rec.recordcount=0来判断过,但还是会报错,在网上搜了原因,贴出来一起学习:
----------------------------------------------------------------------------------------------------
具体原因引用ms的对vb常见问题的解答:

Q————USER:
我查询 ADO recordset的RecordCount属性总是返回 -1。

A————MS:
在ADO 1.5版本时当我们用adOpenForwardonly 游标类型打开记录集时,RecordCount属性返回 -1,在ADO 2.0, 2.1和2.5版本时用adOpenDynamic类型也会发生这种情况。因此如果要访问记录集的RecordCount属性,请使用adOpenKeyset 或 adOpenStatic作为Server端的游标或使用客户端的游标打开记录集。另外请注意使用的LockType,有些LockType会强制改变游标类型。如果数据供给程序不支持你所设的游标类型,数据供给程序可能会使用一种相近的游标作为替换,也造成游标类型的改变,请同时参照数据供给程序的文档。
--------------------------------------------------------------------------------------------------------
有的时候查询返回的结果集的recordcount的属性会返回-1,但并不表明查询的结果集为空。
所以最好还是使用第一种方式:
ado.recordset.bof and ado.recordset.eof
来判断比较好

[ 本帖最后由 lmwangwang 于 2010-9-16 10:28 编辑 ]
回复 支持 反对

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-10-1 19:40 , Processed in 0.098008 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表