存储过程不返回记录集导致ADO程序出错
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;
3 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程序出错的更多相关文章
- Oracle 存储过程例子返回记录集
转载:https://www.cnblogs.com/mikalshao/articles/1454134.html Oracle 不支持批量查询,因此无法从一个命令返回多个结果集.使用存储过程时,返 ...
- mybatis springmvc调用oracle存储过程,返回记录集
参考: http://bbs.csdn.net/topics/390866155 辅助参考: http://www.2cto.com/kf/201307/226848.html http://blog ...
- 基于Spring Boot,使用JPA调用Sql Server数据库的存储过程并返回记录集合
在上一篇<基于Spring Boot,使用JPA操作Sql Server数据库完成CRUD>中完成了使用JPA对实体数据的CRUD操作. 那么,有些情况,会把一些查询语句写在存储过程中,由 ...
- PB中用oracle的存储过程返回记录集做数据源来生成数据窗口,PB会找不到此存储过程及不能正常识别存储过程的参数问题(转)
(转)在PB中用oracle的存储过程返回记录集做数据源来生成数据窗口 首先oracle的存储过程写法与MSSQL不一样,差别比较大. 如果是返回数据集的存储过程则需要利用oracle的包来定义游标. ...
- oracle创建存储过程并返回结果集(附C#调用代码)
使用存储过程中,最常用的莫过于查询数据表,并返回结果集. 在SQL SERVER 中,这类操作最简单,通过简单的select * from xx 即可完成.但是在Oracle中并不支持这种写法,那么我 ...
- 现场故障-数据量超出plsql developer结果集导致应用程序无数据现象
情景重现: 维护人员想要用plsql developer工具查看一年前某表的数据,表中数据约30W行,因为此时无业务,维护人员关闭了应用程序.查询时选择了将所有数据所有列出,结果在显示到3W多行时,弹 ...
- java调用oracle存储过程,返回结果集
package com.srie.db.pro; import java.sql.CallableStatement; import java.sql.Connection; import java. ...
- oracle的存储过程如何返回结果集
CREATE OR REPLACE PACKAGE pkg_test AS TYPE myrctype IS REF CURSOR; PROCEDURE get (p_id NUM ...
- oracle 存储过程返回结果集 (转载)
好久没上来了, 难道今天工作时间稍有空闲, 研究了一下oracle存储过程返回结果集. 配合oracle临时表, 使用存储过程来返回结果集的数据读取方式可以解决海量数据表与其他表的连接问题. 在存储过 ...
随机推荐
- mongo操作及相关资料
mongo操作 find方法 db.collection_name.find(); 查询所有的结果: select * from users; db.users.find(); 指定返回那些列(键): ...
- informatica 参数文件配置
Informatica 中 parameter file 参数文件配置规则: 参数文件的头部内容 [Global] All Integration Services, Integration Serv ...
- asp.net web网站权限系统的简单设计
权限设计总结一句话就是:拥有权限的主体来管控系统的各种资源资源,及在资源上体现的各种操作. 概括来说就是,权限离不开三要素: 1:权限的主体 2:管控的资源 3:各种操作 现对三要素分别做简单的阐述 ...
- vue自动化单元测试
// 引用vue和需要测试的组件 import Vue from 'vue' import HelloWorld from '@/components/HelloWorld' // 创建测试套件,一个 ...
- 在VC中向数据库提交SLQ语句
1.通过链接对象执行SQL语句 mfc没有提供对ado的操作类,它对ado的操作是通过智能指针来完成,要创建ado连接对象,需要像下面代码一样先定义一个连接对象的智能指针: _ConnectionPt ...
- mongodump 失败且导致mongo服务挂掉【本质原因,wt文件损坏】
====================================================== 标题遇到的问题是我要解决的问题的中间环节. 原本问题是:需要在之前standlone的Mo ...
- FreeRTOS 低功耗之待机模式
STM32F103 如何进入待机模式在 FreeRTOS 系统中,让 STM32 进入待机模式比较容易,调用固件库函数PWR_EnterSTANDBYMode 即可. STM32F103 如何退出待机 ...
- VBA学习笔记(6)--抽取第一列中叫“虹虹”的个人信息
说明(2017.3.25): 1. 知识点为dim arr2(1 to 1000, 1 to 4)先定义一个足够大的二维数组,不然后面需要transpose转置成一维数组. '抽取列表中叫“虹虹”的所 ...
- Python3 Scrapy 安装方法
Python3 Scrapy 安装方法 (一脸辛酸泪) 写在前面 最近在学习爬虫,在熟悉了Python语言和BeautifulSoup4后打算下个爬虫框架试试. 没想到啊,这坑太深了... 看了看相关 ...
- J2EE面试题集锦_
一.基础问答 不能被继承的类有[Long Double Float Short Void Class Math String] 他们都被final修饰 类可以被继承[Th ...