lmwangwang 发表于 2010-9-15 19:35:08

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

这段脚本其实就是想判断一下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
      '                   exitfor
         '   End If
      'Next
    rec.Close
    Set rec=nothing
    cnn.Close
    Set cnn=nothing
Next

[ 本帖最后由 lmwangwang 于 2010-9-16 10:27 编辑 ]

lmwangwang 发表于 2010-9-16 09:58:32

怎么没人回帖呢?是不是问题表述的不清楚啊:( 换句话说,如果recordset集合中没有数据是不是等于recz(0)=null 或" " 呢? 还是说recordset这个集合不允许为空?我查了一下,没有找到相关说明,熟悉recordset的大牛出来指点一下吧~~~~

skyzhu 发表于 2010-9-16 09:59:55

rec.Fields("zzz")
rec.Fields(0)

do while not rec.EOF
loop

lmwangwang 发表于 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]
查看完整版本: recordset连接数据库后查询结果为空系统就报'General run error'