请问ADO中怎样获取存储过程的返回值? 可以传递参数,该参数的类型为adreturnValue这里有个例子:http://www.itraining.net.cn/lzh/article.asp?art_id=622 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 应该是adParamReturn.但我试了一下,若执行 ... pCmd->Execute(NULL,NULL,adCmdStoredProc);//1 _bstr_t vtSbpzh=pPrm->GetValue().bstrVal);//2正常 vtSbpzh=5 若执行 pRecordset=pCmd->Execute(NULL,NULL,adCmdStoredProc);//1 _bstr_t vtSbpzh=pPrm->GetValue().bstrVal);//2异常 vtSbpzh=""请问是为什么?原代码如下: _CommandPtr pCmd; _ConnectionPtr pCon; _RecordsetPtr pRecordset; pCmd.CreateInstance(__uuidof(Command)); pCon.CreateInstance(__uuidof(Connection)); pRecordset.CreateInstance (__uuidof(Recordset)); _ParameterPtr pPrm; HRESULT hr; try{ hr=pCon->Open(_bstr_t("DSN=NewKnDB"),_bstr_t("sa"), _bstr_t(""),-1); pPrm=pCmd->CreateParameter("sbpzh", adVarChar, adParamReturnValue, 100, ""); hr=pCmd->Parameters->Append(pPrm); pCmd->CommandText="sp_test"; pCmd->CommandType=adCmdStoredProc; pCmd->ActiveConnection=pCon; //pRecordset=pCmd->Execute(NULL,NULL,adCmdStoredProc);//??? pCmd->Execute(NULL,NULL,adCmdStoredProc);//ok _bstr_t vtSbpzh=pPrm->GetValue().bstrVal);//2正常 返回5 }catch(_com_error &e) { CHAR m[1000]; lstrcpy(m,e.Description()); //return e.Error(); } 上面的兄弟看来和我经历了一样的摸索啊,对了,告诉大家一件事,就是要把记录集放在客户端,而不要选服务器端,要不然你的程序返回值永远都是零。补充一点,如果要做一个专门的调用存储过程的函数,可以不用adCmdStoredProc而用adCmdText这样你就可以用问号替代参数的位置,这样合成的调用适合很多场合,例如:pCmd->CommandText="{?=call sp_test(?,?)}",然后存储过程的名称可以合成,后面参数的个数也可以合成。上面的老兄错误返回处理的不好,如果要把COM里的错误返回还得另外写,还有把存储过程里的错误返回还需要一点技巧。今天心情不好,程序员太辛苦,受得罪太多,是个伪百领,地位和民工差不多。以后再和各位交流。 {?=call sp_Test}.junma(黑木凯) 真是英明多谢了 VC DoModal类型之子窗口关闭问题 日程软件如何实现通过月历添加事件 关于ActiveX控件的显示问题 补充问题!马上给分 怎么去掉CComboBox的选中状态? 奇怪的问题! 求助:如何用VC实现Photoshop中设置图象大小的功能? 十万火鸡......用什么办法能把vfw的捕捉到的图片直接存成JPEG格式 有些函数的申明有 WINAPI 修饰,是什么意思? 无窗口ActiveX控件播放视频的问题 一个COM控件的注册历程....谁来终结 看来真的没ATL高手了,“?ATL高手”的贴子这么长时间,居然没有人回答,惨!!!
但我试了一下,若执行
...
pCmd->Execute(NULL,NULL,adCmdStoredProc);//1
_bstr_t vtSbpzh=pPrm->GetValue().bstrVal);//2正常 vtSbpzh=5
若执行
pRecordset=pCmd->Execute(NULL,NULL,adCmdStoredProc);//1
_bstr_t vtSbpzh=pPrm->GetValue().bstrVal);//2异常 vtSbpzh=""
请问是为什么?
原代码如下:
_CommandPtr pCmd;
_ConnectionPtr pCon;
_RecordsetPtr pRecordset;
pCmd.CreateInstance(__uuidof(Command));
pCon.CreateInstance(__uuidof(Connection));
pRecordset.CreateInstance (__uuidof(Recordset));
_ParameterPtr pPrm;
HRESULT hr;
try{
hr=pCon->Open(_bstr_t("DSN=NewKnDB"),_bstr_t("sa"),
_bstr_t(""),-1);
pPrm=pCmd->CreateParameter("sbpzh", adVarChar, adParamReturnValue, 100, "");
hr=pCmd->Parameters->Append(pPrm);
pCmd->CommandText="sp_test";
pCmd->CommandType=adCmdStoredProc;
pCmd->ActiveConnection=pCon;
//pRecordset=pCmd->Execute(NULL,NULL,adCmdStoredProc);//???
pCmd->Execute(NULL,NULL,adCmdStoredProc);//ok
_bstr_t vtSbpzh=pPrm->GetValue().bstrVal);//2正常 返回5
}catch(_com_error &e) {
CHAR m[1000];
lstrcpy(m,e.Description());
//return e.Error();
}
补充一点,如果要做一个专门的调用存储过程的函数,可以不用adCmdStoredProc而用adCmdText这样你就可以用问号替代参数的位置,这样合成的调用适合很多场合,例如:
pCmd->CommandText="{?=call sp_test(?,?)}",然后存储过程的名称可以合成,后面参数的个数也可以合成。上面的老兄错误返回处理的不好,如果要把COM里的错误返回还得另外写,还有把存储过程里的错误返回还需要一点技巧。今天心情不好,程序员太辛苦,受得罪太多,是个伪百领,地位和民工差不多。
以后再和各位交流。
junma(黑木凯) 真是英明多谢了