"对象打开时,不允许操作"——恼人的bug

简介:
一个该死的bug困扰我两天多了,因为需求更改,原有的软件增加报表功能;基于以前写好的存储过程的基础上,利用DELPHI中带的RAVE组件,实现报表打印,在原有的软件基础上,新增加了一个窗体frmPrint。
       窗体内的代码就不多讲述了,关于如何使用带参数的存储过程进行报表打印,我将稍后进行总结归纳。现在讲一下程序的大概思路和出现的恼人问题。
       为了移植方便,程序通过读取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 
 %>
<%
 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,如需转载请自行联系原作者
相关文章
VSPD虚拟串口软件安装及使用
VSPD虚拟串口软件安装及使用
7012 0
|
11月前
|
Linux Windows
Windows 10/11从官网下载ISO的方法
本文介绍了两种从微软官网下载Windows 10/11 ISO镜像的方法。一是通过修改浏览器User Agent为Linux系统,使官网提供ISO下载链接;二是使用UUPDUMP工具,从官网下载并转换为ISO格式,支持最新开发版,操作简便。
|
8月前
|
机器学习/深度学习 算法 Java
批量发货处理接口技术解析
批量发货接口通过聚合订单提升效率,降低系统负载。支持千级订单并发处理,采用事务控制、异步校验与分页内存优化,保障高性能与数据一致性。结合207状态码返回明细结果,实现部分成功场景下的可靠交付。
|
缓存 NoSQL 算法
解决Redis缓存雪崩问题的有效方法
解决Redis缓存雪崩问题的有效方法
447 1
|
开发者 iOS开发
苹果开发者账号续费流程及苹果开发者账号续费流程及下架处理
苹果开发者账号续费流程及苹果开发者账号续费流程及下架处理
|
存储 网络协议 安全
30 道初级网络工程师面试题,涵盖 OSI 模型、TCP/IP 协议栈、IP 地址、子网掩码、VLAN、STP、DHCP、DNS、防火墙、NAT、VPN 等基础知识和技术,帮助小白们充分准备面试,顺利踏入职场
本文精选了 30 道初级网络工程师面试题,涵盖 OSI 模型、TCP/IP 协议栈、IP 地址、子网掩码、VLAN、STP、DHCP、DNS、防火墙、NAT、VPN 等基础知识和技术,帮助小白们充分准备面试,顺利踏入职场。
2389 2
|
监控 关系型数据库 MySQL
守护进程到底是什么?如何创建?(图文并茂,你不得不看的一篇文章)
**守护进程(Daemon Process)详解**:守护进程是后台运行的无终端关联的系统进程,常在启动时启动,提供持续服务,如网络服务、日志记录和定时任务。其特点包括脱离终端、后台运行、持久服务、资源管理和错误处理。创建守护进程涉及重定向文件描述符、创建新会话、改变工作目录等步骤。`ps` 和 `top` 命令用于查看守护进程,前者提供进程快照,后者显示实时资源使用情况。
1917 0
|
移动开发 HTML5
HTML5中的Web Notification桌面通知(右下角提示)
HTML5中的Web Notification桌面通知(右下角提示)
363 0
|
存储 编译器 BI
内存函数​(memcpy、memmove、memset、memcmp)
内存函数​(memcpy、memmove、memset、memcmp)

热门文章

最新文章