HRESULT _hr = get_adoEOF(&_result);

IsEOF()函数如下:其中ADOCG::_RecordsetPtr m_pRecordset;

BOOL IsEOF()       {return m_pRecordset->adoEOF == VARIANT_TRUE;};

m_pRecordset->adoEOF 将执行下面的函数(见msado15。tli)

1    inline VARIANT_BOOL Recordset15::GetadoEOF ( ) {

2         VARIANT_BOOL _result = 0;

        HRESULT _hr = get_adoEOF(&_result);

4         if (FAILED(_hr)) _com_issue_errorex(_hr, this, __uuidof(this));

5         return _result;

6     }

程序将在上述第三行代码处抛出异常。

经过查询网上的资料以及和同事一起研究发现。在存储过程中没有返回记录集的路径中增加一个SELECT TOP 0 0 创造一个空记录集返回也可避免该异常的发生。所以,存储过程中没有返回记录集是导致该问题的根本原因。

还有一种避免(仅仅是避免)该异常的方法是在执行完存储过程后,先使用如下代码来判断记录集是否已经打开

if (m_pRecordset->GetState() == ADOCG::adStateClosed)

return  FALSE;

else

return  TRUE;

如果记录集未打开,则直接通知上传调用模块不要再做记录集操作。

最后小结下该问题的处理方法。

1.程序调用存储过程时,是否返回记录集时由存储过程本身决定的。一般的我们首先使用SET NOCOUNT ON 来关闭计数,防止干扰我们通过SELECT语句返回我们期望的记录集。

2.从存储过程本身下手。保证设计为返回记录集的存储过程,必须在任何时候都有查询语句返回记录集。即使查询条件不符合也要返回一个空记录集。以保证存储过程的健壮性。

3.修改ADO封装类的函数:BOOL CADORecordset::Open(LPCTSTR lpstrExec)

在执行存储过程并返回记录集后,先检查记录集是否打开。如果未打开,则返回FALSE,通知上层程序,打开记录集出错。 应该进行相应的错误处理而不是继续操作记录集。

存储过程不返回记录集导致ADO程序出错的分析 - nscboy的专栏 - CSDN博客 http://blog.csdn.net/nscboy/article/details/4168777

存储过程不返回记录集导致ADO程序出错的更多相关文章

  1. Oracle 存储过程例子返回记录集

    转载:https://www.cnblogs.com/mikalshao/articles/1454134.html Oracle 不支持批量查询,因此无法从一个命令返回多个结果集.使用存储过程时,返 ...

  2. mybatis springmvc调用oracle存储过程,返回记录集

    参考: http://bbs.csdn.net/topics/390866155 辅助参考: http://www.2cto.com/kf/201307/226848.html http://blog ...

  3. 基于Spring Boot,使用JPA调用Sql Server数据库的存储过程并返回记录集合

    在上一篇<基于Spring Boot,使用JPA操作Sql Server数据库完成CRUD>中完成了使用JPA对实体数据的CRUD操作. 那么,有些情况,会把一些查询语句写在存储过程中,由 ...

  4. PB中用oracle的存储过程返回记录集做数据源来生成数据窗口,PB会找不到此存储过程及不能正常识别存储过程的参数问题(转)

    (转)在PB中用oracle的存储过程返回记录集做数据源来生成数据窗口 首先oracle的存储过程写法与MSSQL不一样,差别比较大. 如果是返回数据集的存储过程则需要利用oracle的包来定义游标. ...

  5. oracle创建存储过程并返回结果集(附C#调用代码)

    使用存储过程中,最常用的莫过于查询数据表,并返回结果集. 在SQL SERVER 中,这类操作最简单,通过简单的select * from xx 即可完成.但是在Oracle中并不支持这种写法,那么我 ...

  6. 现场故障-数据量超出plsql developer结果集导致应用程序无数据现象

    情景重现: 维护人员想要用plsql developer工具查看一年前某表的数据,表中数据约30W行,因为此时无业务,维护人员关闭了应用程序.查询时选择了将所有数据所有列出,结果在显示到3W多行时,弹 ...

  7. java调用oracle存储过程,返回结果集

    package com.srie.db.pro; import java.sql.CallableStatement; import java.sql.Connection; import java. ...

  8. oracle的存储过程如何返回结果集

    CREATE OR REPLACE PACKAGE pkg_test AS     TYPE myrctype IS REF CURSOR;       PROCEDURE get (p_id NUM ...

  9. oracle 存储过程返回结果集 (转载)

    好久没上来了, 难道今天工作时间稍有空闲, 研究了一下oracle存储过程返回结果集. 配合oracle临时表, 使用存储过程来返回结果集的数据读取方式可以解决海量数据表与其他表的连接问题. 在存储过 ...

随机推荐

  1. 错误 1 error LNK2019: 无法解析的外部符号 "public: __thiscall Distance::Distance(int)" (??0Distance@@QAE@H@Z),该符号在函数 _main 中被引用

    错误: 错误 1 error LNK2019: 无法解析的外部符号 "public: __thiscall Distance::Distance(int)" (??0Distanc ...

  2. 每日英语:New Reason To Get The Kids To Bed On Time

    Going to bed at the same time every night could give your child's brain a boost, a recent study foun ...

  3. LeetCode: Wildcard Matching 解题报告

    Wildcard MatchingImplement wildcard pattern matching with support for '?' and '*'. '?' Matches any s ...

  4. eclipse 启动报share library load faild

      eclipse 与 jdk 版本要一致 *32 - 对应32位 *64 - 对应64位

  5. SharePoint自动化系列——Upload files to SharePoint library using PowerShell.

    转载请注明出自天外归云的博客园:http://www.cnblogs.com/LanTianYou/ 日常的SharePoint站点测试中,我们经常要做各种各样的数据,今天又写了几个脚本,发现自己写的 ...

  6. c++派生类的访问控制权限

    派生类必须通过使用类派生列表, 明确指出它是从哪个(哪些)基类继承而来的.类派生列表的形式是:首先是一个冒号,后面紧跟以逗号分隔的基类列表(可以多继承,但一般不使用多继承),其中每个基类前面可以有以下 ...

  7. vim自动跳转到引用的函数

        安装:  yum install ctags 在你代码的根目录下执行:比如/data/www/test/trunkctags -R * 打开文件只能在根目录下打开就可以,比如 vim appl ...

  8. 【WPF】设置TextBox内容为空时的提示文字

    <TextBox Width="150" Margin="5"> <TextBox.Resources> <VisualBrush ...

  9. linux中hive无法使用删除键或无反应

    用的工具secureCRT连接linux服务器的,登录到hive中后无法使用删除键. 修改如下: 会话选项 -> 终端|仿真 ->  选择终端为linux.

  10. Elasticsearch 5

    Elasticsearch 5常见问题解决方案     安装运行 1.前置安装java8 jdk-8u112-linux-x64.rpm 下载地址:http://www.oracle.com/tech ...