关于存储过程的ADO调用的一些心得(输出参数,返回值)

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

http://blog.csdn.net/Willin/archive/2004/12/21/224027.aspx

在一个项目中,我需要用到存储过程来访问数据,为了提供一个比较一致的接口以便调用,我没有使用CreateParameter(),而是调用CommandPtr的Refresh()函数先从数据库中查询参数.
_ConnectionPtr m_pConn;
m_pConn.CreateInstance(__uuidof(Connection));
m_pConn->Open("driver={SQL Server};server=127.0.0.1;DATABASE=pub;UID=sa;PWD=", "","",0);

_CommandPtr  m_pCommand;
m_pCommand.CreateInstance(__uuidof(Command));
_RecordsetPtr m_pRecordset;
m_pRecordset.CreateInstance(__uuidof(Recordset));

m_pCommand->ActiveConnection = m_pConn;
m_pCommand->CommandText = "SP_XX";//存储过程名
m_pCommand->PutCommandType(adCmdStoredProc);
m_pCommand->Parameters->Refresh();//从数据库查询参数信息

接下来就可以对每一个参数赋值了:
long cnt = m_pCommand->Parameters->GetCount();//取得参数的个数
for(long k=1;k<cnt;k++)
{//由于ADO中认为返回值是第一个参数,因此这里用k=1滤掉第一个参数
 m_pCommand->Parameters->GetItem(k)->Value = XXX;//按存储过程的参数顺序给参数赋值
}

现在可以执行这个存储过程了
m_pRecordset = m_pCommand->Execute(0,0,adCmdStoredProc);
这个时候,如果接下来用
_variant_t ret_val = m_pCommand->Parameters->GetItem((long)0)->Value;
那么将得不到值
而如果像下面这样调用的话就可以得到返回值了
m_pRecordset->Close();
_variant_t output_para = m_pCommand->Parameters->GetItem((long)0)->Value;
MS ADO.net给这一现象的回复是:
 You can think of a stored procedure as a function in your code. The function doesn’t return a value until it has executed all of its code. If the stored procedure returns results and you haven’t finished processing these results, the stored procedure hasn’t really finished executing. Until you’ve closed the DataReader, the return and output parameters of your Command won’t contain the values returned by your stored procedure.
也就是说Execute()函数应该看成是直到m_pRecordset关掉以后才会正确返回.

关于输出参数的处理也和这一样,因为返回值本身就是当成输出参数来处理的.
通过这种方法,我们可以得到一个存储过程的返回值和结果集,而且对于所有的存储过程都可以一样使用,不必为某个特定的存储过程去写代码,具有一定的通用性.

 
使用来ADO.NET调用存储过程 ADO.NET调用存储过程使用存储过程ADO.NET中调用存储过程调用带参存储过程,获取输出参数值 使用存储过程 存储过程有两点优点: 性能高 安全性好 在ADO.NET中调用存储过程 SqlCommand cmd = new SqlCommand(); cmd.CommandText ="sp_update_student"; cmd.CommendType = CommandType.StoredProcedure; //...定义和添加SqlParameter参数 //...打开链接并执行命令 阅读详情

相关推荐

​​​​​​ADO.NET调用存储过程

等替换为适合你的存储过程数据库环境的信息。如果存储过程不需要任何参数,你可以省略添加参数的代码部分。同样地,如果存储过程返回值输出参数,请确保按照你的存储过程的定义来处理它们。然后,我们添加了任何必需的输入参数,并执行了存储过程。如果存储过程输出参数返回值,我们还需要在执行后读取这些值。中调用存储过程是一个常见的任务,因为存储过程可以提供更好的性能、减少网络流量,并允许数据库管理员对数据操作进行优化和维护。如果存储过程输出参数返回值,也需要处理。如果存储过程输出参数返回值,读取它们。

赵玉的专栏 2006

ado的mysql参数化,“必须声明变量@ myvariable” ADO参数化查询出错

i am trying to use parameterized queries with ADO. Executing the Command object throws the error:Must declare the variable '@filename'i declare the parameter @filename using CreateParameter/Append:sql...

weixin_39747087的博客 143

ADO调用存储过程||ADO读取结果集

使用ADO调用存储过程 ADO调用存储过程 显示到listvie VC6.0测试通过

ado的mysql参数化_ADO参数化(VBA)

ADO参数化的好处避免SQL注入攻击;2. 省去SQL字符串拼接;3. 避免出错方式一Dim cn As ADODB.ConnectionDim rs As ADODB.RecordsetDim cmd As ADODB.CommandDim param As ADODB.ParameterDim Sql As Stringsql = "Select * From tb Where userNam...

weixin_29671351的博客 431

ado mysql 存储过程,VC中使用ADO调用存储过程实现方法

开发环境是VS2005 ,数据库是SQL Sever 20001. 在进入正题之前,先讲点别的,如何在VC中连接Sybase数据库,连接字符窜为,_bstr_t strCnn(\"Driver={Sybase System 11};Srvr=RRRRR;Uid=RRR_Mao_bb1;Pwd=user2\");这,RRRRR是数据库的名称,已经在Sybase->sdedit中设定好了RR...

weixin_27379781的博客 177

freesql 执行存储过程out参数

/.Query<T>() 或者 .ExecuteDataTable() 或者 ...//Output 参数

kuyz1的专栏 681

C#调用存储过程详解(返回值参数输入输出)

C#调用存储过程详解(返回值参数输入输出) 这篇文章主要介绍了C#调用存储过程的方法,结合实例形式详细分析了各种常用的存储过程调用方法,包括带返回值参数输入输出等,需要的朋友可以参考下 本文实例讲述了C#调用存储过程的方法。分享给大家供大家参考,具体如下: 1 2 3 4 5 6 7 8 9 10 ...

cxu123321的博客 6130

ASP.NET调用存储过程返回输出参数,获得返回值

ASP.NET调用存储过程获得返回值--------------------------------------------假设有存储过程如下:---------------------------------------------CREATE proc sp_uptmp @tmpName varchar(50),@srcPos varchar(255)

生活要快乐 - 魏言 2024

使用ADO调用存储过程

        在ADO调用存储过程一直是一个困扰大家的问题。其实,关于ADO调用存储过程的方法在很多书中都有讲到,标准的做法无非是按照以下步骤进行:1、生成并初始化一个_CommandPtr对象;2、生成调用存储过程需要的参数,这些参数都是_ParameterPtr对象;3、按照顺序将使用_CommandPtr的Append方法为存储过程提供参数(包括输入参数输出参数);4、为_Comman

谭洪星 1642

如何调用存储过程,有返回值的,有参数的,存储过程调用存储过程

存储过程return与output区别 共同点:都返回值(但return只能返回int类型)     不同点: 1.output是定义变量是不是可以返回值     2.output没有return从查询或过程中无条件退出的工功     3.return返回值在函数和过程定义时不需要用output来定义  我想用存储过程,是一个查询的存储过程. 把查询的记录返回.net我接收这个返

mutaomutao的专栏 4098

VC++ ADO调用存储过程方法

约定: 斜体字体表示可变部分   斜体 红色字体表示固定部分   红体   以下步骤的前提条件:COM ADO库已初始化,已经设置_ConnectionPtr连接对象。   步骤一: 创建 _CommandPtr 对象并初始化        _CommandPtr pCommand; pCommand.CreateInstance(__uu

拥抱变化 5716

Ado.Net调用带输入,输出参数存储过程

第一步:在数据中编写好通过编号来获取当前学生的更多信息的存储过程(以学生表为主,暂时不展示数据) ---根据编号来查询出学生的其他信息,带输入输出参数 if(exists(select * from sys.objects where name = 'proc_getStudentOtherInfoBySid'))    //判断当前数据库中是否存在这个存储过程    drop proc p

Lover_lang的博客 1572

VC中使用ADO之二--调用存储过程

开发环境是VS2005  ,数据库是SQL Sever 20001. 在进入正题之前,先讲点别的,如何在VC中连接Sybase数据库,   连接字符窜为,  _bstr_t strCnn("Driver={Sybase System 11};Srvr=RRRRR;Uid=RRR_Mao_bb1;Pwd=user2");这,RRRRR是数据库的名称,已经在Sybase->sdedi

毛毛(handsomerun)的专栏 6027

VBA + ADO 调用存储过程

最近对 pandas, Power Query 和 SQL数据处理和加工进行了一些类似的处理,希望通过比较看到各种处理方式的优点。之前笔者用的比较多的是 VBA + ADO,VBA + ADO 的方式其实离不开 Sql 语句,这种方式也有非常方便:前台有 Excel,后台有数据库就能实现...

王敏的专栏 3098

ADO教程(执行带参数存储过程

由于最近项目上要使用ADO访问数据库,而网上又没有非常完整的帖子,干脆摸着石头过河来总结一个ADO的使用;首先不得不说ADO的使用率并不是很高 1.ADO是微软提供的访问各种数据库的统一接口,是对底层的COM技术OLE DB的封装;它的主要优点是易于使用,高速度,低内存开销,和一个小磁盘占用,缺点:开发效率相对不高; ADO 是一个面向对象的 COM 组件库,用 ADO 访问

kop看台 4825
上一篇: VC中使用ADO调用存储过程
下一篇: 使用ADO调用存储过程
max2008
博客等级 码龄20年 69粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值