这个问题我已经发过一次,但帖子沉了。希望这次高手们能给初学者们做个详细点解答。
自恃甚高,评头论足而不给出实用解释者,请节省自己的时间。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",而我在查询分析器得到的对应结果是符合预期的。请高手们明示!

解决方案 »

  1.   

    conn连接数据库的代码呢?
    conn->open(...)
      

  2.   

    QQ群7346044       Vc++交流区               望得到各位朋友的大力发展.和支持.我们通过相互学习,帮助,让新手学       到了更多.现在招CSDN的大侠们,参与本群.开发本群的项目研究.加入请一定要申明,因人数有限.
      

  3.   

    http://www.vckbase.com/document/viewdoc/?id=496
      

  4.   

    返回数据集和日返回 状态,output参数不能同时用,
    要想取返回状态和output参数,就要先关闭数据集.
      

  5.   

    简单啊:
    // 这里是没有返回记录集,因此,可以取存储过程的返回值和状态值
    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;