主题:  循环产生记录基的问题

林易

职务:普通成员
等级:3
金币:1.0
发贴:750
#12004/8/9 14:37:38
我想在一个表中循环读出6个记录,分两行一行三个排列,我用以下语句不能实现请高人指点,代码如下
<%
		set drs=server.CreateObject("adodb.recordset")
		drs.open "select * from shop_books"
		%>
		<%if drs.eof or drs.bof then
response.write "对不起没有搜索到记录!"
response.end
else
while not drs.eof

%>

		<table width="220" border="0" align="center" cellpadding="0" cellspacing="0">
          <%set rs=server.createobject("adodb.recordset")
		rs.open "select Top 3 * from shop_books where bestbook=1 order by bookid desc",conn,1,1
		if rs.recordcount=0 then 
		%>
          暂无推荐精品 
          <%
		else
		while not rs.eof
		%>
          <td width="688"> 
            <!--#include file="shangping_j.asp"-->
          </td>
          <%rs.movenext
		wend
		end if
%>
          </tr>
        </table>
		<%
		drs.movenext
		wend
		end if
		%>
        <br>



系统报错如下:ADODB.Recordset 错误 '800a0e7d'

连接无法用于执行此操作。在此上下文中它可能已被关闭或无效。

/index.asp,行260
怎么可以解决,谢谢



红卫兵

职务:普通成员
等级:1
金币:0.0
发贴:113
#22004/8/9 18:06:46

<%set rs=server.createobject("adodb.recordset")
出现错误,在此之前应当关闭recordset对象!

建议:可将前面set drs=server.CreateObject("adodb.recordset")
        drs.open "select * from shop_books"
改为set drs=conn.execute("select * from shop_books")



林易

职务:普通成员
等级:3
金币:1.0
发贴:750
#32004/8/12 8:55:14
谢谢,我通过循环<tr>实现了



janlay

职务:管理员
等级:7
金币:28.0
发贴:7244
#42004/8/13 9:54:02
关键是确保 rs.open 之前 rs 这个对象已经关闭。如果在循环中连续 rs.open, 则应在循环结尾处将其close

to 红卫兵: 请确信你的回复对于解决问题有所帮助。事实上这两个写法效果是一样的。



红卫兵

职务:普通成员
等级:1
金币:0.0
发贴:113
#52004/8/13 11:39:02
强烈抗议楼上janlay朋友的言论!

  偶在二楼的回复是当偶看到楼主的问题后因为偶以前碰到过这样的问题,所以就凭印象根据偶以前的解决方法给予热心的帮助。回复的目的也仅仅是想给楼主提供一种解决问题的思路,是偶的热心使然,而没有什么别的意思。
  但是,今天偶然看到janlay朋友的回复,偶感觉到自己的一腔热心受到了极大的伤害,从“请确信你的回复对于解决问题有所帮助。”这句来看,偶感觉到janlay朋友认为偶是在调侃,或者说偶是在误导别人!对于此偶无法接受。
  在这个平台,大家谁也没有义务必须回复别人的问题,之所以有5D的今天,我想这与大家的热心是分不开的,因为任何一个人在热心回复别人的问题的时候都是没有想过回报问题的。
  大家都是5D的朋友,有了问题一起讨论,当别人有了过错的时候直接指出来就可以了,都是年轻人,没有什么不可以接受的,没有必要说一些有伤害别人感情的言论。
  
  对于楼上的问题本身,为了进一步证实偶没有误导大家,偶觉得都有必要做一个验证,下面附上偶的代码和验证结果:
<%
set conn=server.CreateObject("adodb.connection")
conn.open "provider=sqloledb;datasource=zouran;uid=zouran9704;pwd=1981114;data base=hubuonline"
set drs=conn.execute("select * from corpor_self")
%>
<%
if drs.eof or drs.bof then
response.write "对不起没有搜索到记录!"
response.end
else
do while not drs.eof
%>

<%
set rs=server.createobject("adodb.recordset")
rs.open "select * from corpor_self",conn
if rs.recordcount=0 then
%>
暂无推荐精品
<%
else
     while not rs.eof
     response.Write("h.")
rs.movenext
     wend
end if
drs.movenext
response.Write("hello!<br>")
loop
end if
%>
结果显示:
h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.hello!
h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.hello!
h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.hello!
h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.hello!
h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.hello!
h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.hello!
h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.hello!
h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.hello!
h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.hello!
h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.hello!
h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.hello!
h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.hello!
h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.hello!
h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.hello!
h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.hello!
h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.hello!

编辑历史:[此帖最近一次被 红卫兵 编辑过(编辑时间:2004-08-13 11:46:03)]


janlay

职务:管理员
等级:7
金币:28.0
发贴:7244
#62004/8/13 13:19:06
首先,对你能亲自实践表示敬意

我无意伤害你的热心肠,我所说的问题是,“ADODB.Recordset 错误 '800a0e7d' ”是指 connection 对象不能被recordset对象引用。因此,错误源虽然是recordset,但错误并不在此,而在于connection. troubleshotting最重要的是根据错误源及错误代码定位错误,这样才能有效的排除错误。

从错误信息来看,楼主并未将有问题的代码显露出来(注意错误行在260行,从给出代码不足以判断出错位置)。所以你的代码只能按自己的构想来做,得出结果并不能说明什么问题。

看了一下你的代码,如果不介意的话,我来做一下简单的评价。
如果按照编译的方法来做的话,
引用:
set rs=server.createobject("adodb.recordset"
rs.open "select * from corpor_self",conn
if rs.recordcount=0 then
这三行代码至少存在一处警告和一处逻辑错误:
1、不要在循环体内创建对象
2、在rs.open()方法中,省略CursorType和 LockType两个参数,则它们取默认值AdOpenForwardOnly和AdLockReadOnly. 根据 Adodb 定义,recordcount 属性在向前的corsortype中返回-1,所以if rs.recordcount=0 then永远不会执行
另外,由于在循环体内创建了对象,就掩盖了另一个问题:在循环内rs用完时,没有将其close

欢迎深入有益的探讨



红卫兵

职务:普通成员
等级:1
金币:0.0
发贴:113
#72004/8/13 15:44:41
呵呵,收到!

  楼主在帖子中报错为“连接无法用于执行此操作。在此上下文中它可能已被关闭或无效。”偶根据楼主贴出的程序内容加上自己的经验判断连续打开两个recordset对象而没有关闭肯定出错,并且错误中已经提示在260行,我想如果楼主程序里面应当包含260行!
  
  以上测试用的代码仅仅是为了测试“事实上这两个写法效果是一样的”这句话!按照偶的说法修改之后,如果没有语法错误,应该是不会在出现错误的!关于代码为了能充分说明问题偶就直接拷贝楼主的,仅仅是修改了一下查询语句和将table给去掉了。
  偶也是菜鸟,能得到朋友的指教不胜感激!



janlay

职务:管理员
等级:7
金币:28.0
发贴:7244
#82004/8/13 16:33:57
这个错误跟代码的上下文有关,没看到其他代码或相关包含文件,不能断定出错位置。

你可以把你的代码中红字的那一行换成原来的两行,来证明我说的没错 ;)



林易

职务:普通成员
等级:3
金币:1.0
发贴:750
#92004/8/14 14:39:30
两位大哥,非常感谢你们对我的帮助,可能是实现方法上的不同,我实现的方法是产生6个记录集,采取了下面的代码
<table width="99" height="110" border="0" align="center" cellpadding="0" cellspacing="0">
          <tr> 
            <%set rs=server.createobject("adodb.recordset")
		rs.open "select  top 6 * from shop_books where bestbook=1 order by bookid desc",conn,1,1
		do while not rs.eof%>
            <%
		dim e
		e=0
		do while not rs.eof and e<3
		%>
            <td width="688" height="100" valign="top"> <!--#include file="shangping_j.asp"--> </td>
            <%
e=e+1
rs.movenext
Loop
%>
          </tr>
          <%Loop%>
        </table>



红卫兵

职务:普通成员
等级:1
金币:0.0
发贴:113
#102004/8/14 23:15:23
换成原来的代码:
<%
set conn=server.CreateObject("adodb.connection")
conn.open "provider=sqloledb;datasource=zouran;uid=zouran9704;pwd=1981114;data base=hubuonline"
set drs=server.CreateObject("adodb.recordset") 'set drs=conn.execute("select * from corpor_self")
drs.open "select * from corpor_self"

%>
<%
if drs.eof or drs.bof then
response.write "对不起没有搜索到记录!"
response.end
else
do while not drs.eof
%>

<%
set rs=server.createobject("adodb.recordset")
rs.open "select * from corpor_self",conn
if rs.recordcount=0 then
%>
暂无推荐精品
<%
else
while not rs.eof
response.Write("h.")
rs.movenext
wend
end if
drs.movenext
response.Write("hello!<br>")
loop
end if
%>


运行结果显示:
ADODB.Recordset 错误 '800a0e7d'
连接无法用于执行此操作。在此上下文中它可能已被关闭或无效。
/000/Untitled-2.asp,行15

请指教!



janlay

职务:管理员
等级:7
金币:28.0
发贴:7244
#112004/8/15 14:41:41
呵呵,还是 connection 对象的问题,你的drs对象缺少 connection 引用

在open方法前加上一句: drs.activeconnection=conn



红卫兵

职务:普通成员
等级:1
金币:0.0
发贴:113
#122004/8/15 17:49:44
晕啦,搞错了,我是说
如果按照我楼上的代码,也就是你说的“你可以把你的代码中红字的那一行换成原来的两行,来证明我说的没错”,也就是基本上与楼主一样的代码(仅仅修改一下查询语句和将table给去掉),结果报错与楼主的一样。
  但是如果没换之前,也就是我最初的测试代码结果是运行正常的!

换句话说,如果用set drs=server.CreateObject("adodb.recordset") 'set drs=conn.execute("select * from corpor_self")
drs.open "select * from corpor_self"
  报错与楼主一样!
如果换成用set drs=conn.execute("select * from corpor_self")结果运行正常!
从而我认为可以说明,我最初的对楼主的建议极有参考价值,并且说明你的
“事实上这两个写法效果是一样的”、“你可以把你的代码中红字的那一行换成原来的两行,来证明我说的没错 ;)”这两句话错了!

  呵呵,认错吧!?



janlay

职务:管理员
等级:7
金币:28.0
发贴:7244
#132004/8/15 18:53:03
原来的写法确实是缺少一个参数,这才是出错的关键所在。你的语句只不过换了另一个写法,掩盖了真正的问题所在。
如果写法正确,这两种代码效果完全一样
set rs=server.createobject("adodb.recordset")
rs.open strSql,con
set rs=con.execute(strSql)
这才是我要说的问题,而不是要谁认错。

要想攀上颠峰,先保持平和的心态



林易

职务:普通成员
等级:3
金币:1.0
发贴:750
#142004/8/16 13:45:13
高人的心态就是不一样,谢谢了



绿茶

职务:普通成员
等级:8
金币:10.0
发贴:19267
#152004/8/16 15:07:09
在不需要分页的地方,偶喜欢用
set rs=conn.execute(sql)
要分页的时候才用
set rs=server.createobject("adodb.recordset")
rs.open sql,conn,1,1