窗体内的代码就不多讲述了,关于如何使用带参数的存储过程进行报表打印,我将稍后进行总结归纳。现在讲一下程序的大概思路和出现的恼人问题。
为了移植方便,程序通过读取ini文件来配置数据库连接,将连接数据库的信息读出后再进行ADOConnection的连接。其它的数据统计和曲线界面都是使用同样的一个DataMConn数据单元窗体中的一个连接,打印也是不例外的,但是,在实现了全部打印功能后,每次关闭窗体,就出现一个警告窗口:""""""""""对象打开时,不允许操作""""""""""。问了人,也搜了资料,大部分人认为是数据库连接的部分操作不当,但是我反复使用了不同的连接方案,还是存在同样问题,后来索性把这个界面去掉,一个部分一个部分地写,竟然发现,是Show & ShowModal的区别,点击"报表打印"按钮时,如果是Show,则出现那个错误!如果是ShowModal,则不会出现错误!
困扰两天的问题,竟然是这个引起的,我FT无语了!不过,真的在这里抒发一下郁闷心情了!!
关于对象打开时,不允许操作的其他解决方法:
----错误类型:ADODB.Recordset (0x800A0E79)对象打开时,不允许操作。(ASP,SQL SERVER)-------
/ShowBoard.asp, 第 42 行
<%
Set Conn=Server.CreateObject("ADODB.Connection")
Conn.ConnectionString="driver={SQL Server};server=computer;UID=sa;PWD=too.yd;Database=forum"
Conn.Open
Set rsBoard=Server.CreateObject("ADODB.RecordSet")
Set rsArticle=Server.CreateObject("ADODB.RecordSet")
Set rsReply=Server.CreateObject("ADODB.RecordSet")
Set rsLastPostTime=Server.CreateObject("ADODB.RecordSet")
rsBoard.open "select * from Board order by BoardID",Conn,1,1
do while not rsBoard.eof
BoardId=rsBoard("BoardId")
sql1="select count(ArticleId) from Article where BoardID='"&BoardId&"' "
rsArticle.open sql1,Conn,1,1 ‘/////////
sql2="select count(ReplyId) from Reply where BoardID='"&BoardId&"' "
rsReply.open sql2,Conn,1,1
sql3="select * from Article where BoardId='"&BoardId&"' order by ArticlePostTime desc"
rsLastPostTime.open sql3,Conn,1,1
%>
<td width="100" height="15"> </td>
<td width="150"><div align="center"><span class="style1"><%=rsBoard(1)%></span></div></td>
<td width="100" class="style1"><div align="center"><%=rsArticle(0)%></div></td>
<td width="100" class="style1"><div align="center"><%=rsReply(0)%></div></td>
<td width="224" class="style1"><div align="center">
<%
If Not rsLastPostTime.Eof Then
Response.Write rsReplyLast("ArticlePostTime")
Response.Write"/"
Response.Write rsReplyLast("ArticlePoster")
End if
%></div></td>
<%
rsBoard.movenext
Loop
rsPostLastTime.Close
rsReply.Close
rsArticle.Close
rsBoard.Close
%>
----错误类型:ADODB.Recordset (0x800A0E79)对象打开时,不允许操作。(ASP,SQL SERVER)-------
/ShowBoard.asp, 第 42 行
<%
Set Conn=Server.CreateObject("ADODB.Connection")
Conn.ConnectionString="driver={SQL Server};server=computer;UID=sa;PWD=too.yd;Database=forum"
Conn.Open
Set rsBoard=Server.CreateObject("ADODB.RecordSet")
Set rsArticle=Server.CreateObject("ADODB.RecordSet")
Set rsReply=Server.CreateObject("ADODB.RecordSet")
Set rsLastPostTime=Server.CreateObject("ADODB.RecordSet")
rsBoard.open "select * from Board order by BoardID",Conn,1,1
do while not rsBoard.eof
BoardId=rsBoard("BoardId")
sql1="select count(ArticleId) from Article where BoardID='"&BoardId&"' "
rsArticle.open sql1,Conn,1,1 ‘/////////
sql2="select count(ReplyId) from Reply where BoardID='"&BoardId&"' "
rsReply.open sql2,Conn,1,1
sql3="select * from Article where BoardId='"&BoardId&"' order by ArticlePostTime desc"
rsLastPostTime.open sql3,Conn,1,1
%>
<td width="100" height="15"> </td>
<td width="150"><div align="center"><span class="style1"><%=rsBoard(1)%></span></div></td>
<td width="100" class="style1"><div align="center"><%=rsArticle(0)%></div></td>
<td width="100" class="style1"><div align="center"><%=rsReply(0)%></div></td>
<td width="224" class="style1"><div align="center">
<%
If Not rsLastPostTime.Eof Then
Response.Write rsReplyLast("ArticlePostTime")
Response.Write"/"
Response.Write rsReplyLast("ArticlePoster")
End if
%></div></td>
<%
rsBoard.movenext
Loop
rsPostLastTime.Close
rsReply.Close
rsArticle.Close
rsBoard.Close
%>
<%
rsBoard.movenext
Loop
rsPostLastTime.Close
rsReply.Close
rsArticle.Close
rsBoard.Close
%>
中rsPostLastTime.Close rsReply.Close rsArticle.Close 应该在一个循环之后关闭
改为以下就行了
<%
rsBoard.movenext
rsPostLastTime.Close
rsReply.Close
rsArticle.Close
Loop
rsBoard.Close
%>
rsBoard.movenext
Loop
rsPostLastTime.Close
rsReply.Close
rsArticle.Close
rsBoard.Close
%>
中rsPostLastTime.Close rsReply.Close rsArticle.Close 应该在一个循环之后关闭
改为以下就行了
<%
rsBoard.movenext
rsPostLastTime.Close
rsReply.Close
rsArticle.Close
Loop
rsBoard.Close
%>
一般的这种错误都可以通过得到数据库连接时的状态进行解决,避免出现打开一次再打开的情况出现:比如在打开语句rs.Open strsql这句前加上句:if rs.state=adstateopen then rs.close,这样,可以先关闭连接,再打开时就不会出现这个错误了。
本文转自 august 51CTO博客,原文链接:http://blog.51cto.com/august/6973,如需转载请自行联系原作者