这个问题我已经发过一次,但帖子沉了。希望这次高手们能给初学者们做个详细点解答。
自恃甚高,评头论足而不给出实用解释者,请节省自己的时间。ExecProc(const CString& strProcName, \\要执行的存储过程名字
long* returnIntfromProc, \\存储过程返回值在VC6中对应的变量
const CString& strInParam, \\传递给存储过程的输入参数
CString& strOutParam) \\存储过程的output参数对应的C++变量
{
// 定义智能指针,并初始化
_ConnectionPtr Conn;
Conn.CreateInstance(__uuidof(Connection))
_CommandPtr cmd;
_RecordsetPtr rsp;
_ParameterPtr returnParam,INParam,OutParam;
try{
cmd.CreateInstance(__uuidof(Command));
rsp.CreateInstance(__uuidof(Recordset));
cmd->ActiveConnection = Conn;
cmd->CommandText = _bstr_t(strProcName);
returnParam=cmd->CreateParameter(_bstr_t("returnParam"),adInteger,adParamReturnValue,sizeof(int));
cmd->Parameters->Append(returnParam);
INParam=cmd->CreateParameter(_bstr_tINParam"),adBSTR,adParamInput,300,(_variant_t)strInParam);
cmd->Parameters->Append(INParam);
OutParam=cmd->CreateParameter(_bstr_t("OutParam"),adBSTR,adParamInput,300);
cmd->Parameters->Append(OutParam);
cmd->Execute(NULL, NULL, adCmdStoredProc);
// 往后的工作是把存储过程的返回值returnParam中的值取到对应的C++变量returnIntfromProc中,
// 把存储过程的返回参数OutParam中的值取到对应的C++变量strOutParam //怎么做???!!!// 按照论坛里这方面的老兄shakaqrj提供的文章,代码继续如下:
// 取return值
_variant_t result = cmd->Parameters->GetItem("returnParam")->GetValue(); --(1)
if(result.vt==VT_14)returnIntfromPoc = result.iVal; --(2)
// 取output参数
result = cmd->Parameters->GetItem("OutParam")->GetValue(); -- (3)
if(result.vt==VT_BSTR)strOutParam = result.bstrVal;我在VC6中调试该代码段,存储过程调用能够顺利执行,用查询分析器打开过程中的表结构,都按照设想生成了,但下一步执行第(1)句取return参数产生Exception,
而我通过注释掉取return参数的(1)和(2)两行,尝试直接读OutPut参数,执行第(3)句,它与(1)语法完全类似,但没有产生Exception,不过结果读出的是"0",而我在查询分析器得到的对应结果是符合预期的。请高手们明示!
自恃甚高,评头论足而不给出实用解释者,请节省自己的时间。ExecProc(const CString& strProcName, \\要执行的存储过程名字
long* returnIntfromProc, \\存储过程返回值在VC6中对应的变量
const CString& strInParam, \\传递给存储过程的输入参数
CString& strOutParam) \\存储过程的output参数对应的C++变量
{
// 定义智能指针,并初始化
_ConnectionPtr Conn;
Conn.CreateInstance(__uuidof(Connection))
_CommandPtr cmd;
_RecordsetPtr rsp;
_ParameterPtr returnParam,INParam,OutParam;
try{
cmd.CreateInstance(__uuidof(Command));
rsp.CreateInstance(__uuidof(Recordset));
cmd->ActiveConnection = Conn;
cmd->CommandText = _bstr_t(strProcName);
returnParam=cmd->CreateParameter(_bstr_t("returnParam"),adInteger,adParamReturnValue,sizeof(int));
cmd->Parameters->Append(returnParam);
INParam=cmd->CreateParameter(_bstr_tINParam"),adBSTR,adParamInput,300,(_variant_t)strInParam);
cmd->Parameters->Append(INParam);
OutParam=cmd->CreateParameter(_bstr_t("OutParam"),adBSTR,adParamInput,300);
cmd->Parameters->Append(OutParam);
cmd->Execute(NULL, NULL, adCmdStoredProc);
// 往后的工作是把存储过程的返回值returnParam中的值取到对应的C++变量returnIntfromProc中,
// 把存储过程的返回参数OutParam中的值取到对应的C++变量strOutParam //怎么做???!!!// 按照论坛里这方面的老兄shakaqrj提供的文章,代码继续如下:
// 取return值
_variant_t result = cmd->Parameters->GetItem("returnParam")->GetValue(); --(1)
if(result.vt==VT_14)returnIntfromPoc = result.iVal; --(2)
// 取output参数
result = cmd->Parameters->GetItem("OutParam")->GetValue(); -- (3)
if(result.vt==VT_BSTR)strOutParam = result.bstrVal;我在VC6中调试该代码段,存储过程调用能够顺利执行,用查询分析器打开过程中的表结构,都按照设想生成了,但下一步执行第(1)句取return参数产生Exception,
而我通过注释掉取return参数的(1)和(2)两行,尝试直接读OutPut参数,执行第(3)句,它与(1)语法完全类似,但没有产生Exception,不过结果读出的是"0",而我在查询分析器得到的对应结果是符合预期的。请高手们明示!
解决方案 »
- 请教各位大神有没有可以调用 bt软件开源的com组件啊
- 我的 IP Address控件为什么在运行时显示不了?
- 用API写的串口,为什么接收字符的时候分段接收?【急】
- 能不能用memcpy把CString 拷贝到CString 类型中
- 如何实现象windows画图板中左侧的工具栏,所有的工具成4-5列,
- 请问用vc怎么样做cgi,或者用c,c++如何做(急)
- 确定子窗口的大小和位置
- MFC中执行带有变量的SQL语句问题
- vc8 ddx_text()
- 我在CListView里插入列,怎么没有反映?请看代码:
- 想自学3D游戏编程,用的是VC和DIRECTX,推荐一下有什么好的书籍
- 一个草船借鸡蛋的话题:想学好C++千万别学MFC。
conn->open(...)
要想取返回状态和output参数,就要先关闭数据集.
// 这里是没有返回记录集,因此,可以取存储过程的返回值和状态值
cmd->Execute(NULL, NULL, adCmdStoredProc); // 取输出参数 returnParam
_variant_t result = cmd->Parameters->GetItem("returnParam")->GetValue(); --(1)
if(result.vt==VT_14)returnIntfromPoc = result.iVal; --(2)
// 取输出参数 OutParam
result = cmd->Parameters->GetItem("OutParam")->GetValue(); -- (3)
if(result.vt==VT_BSTR)strOutParam = result.bstrVal; ///////////////////////////////////////////
// 下面是有返回记录集的调用存储过程方式
_RecordsetPtr ptr = cmd->Execute(NULL, NULL, adCmdStoredProc);
// 下面取任何输出参数均无效,不可用;只能取记录集记录了
// 取输出参数 returnParam
_variant_t result = cmd->Parameters->GetItem("returnParam")->GetValue(); --(1)
if(result.vt==VT_14)returnIntfromPoc = result.iVal; --(2)
// 取输出参数 OutParam
result = cmd->Parameters->GetItem("OutParam")->GetValue(); -- (3)
if(result.vt==VT_BSTR)strOutParam = result.bstrVal;