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 编辑 ] 怎么没人回帖呢?是不是问题表述的不清楚啊:( 换句话说,如果recordset集合中没有数据是不是等于recz(0)=null 或" " 呢? 还是说recordset这个集合不允许为空?我查了一下,没有找到相关说明,熟悉recordset的大牛出来指点一下吧~~~~ rec.Fields("zzz")
rec.Fields(0)
do while not rec.EOF
loop 谢谢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]