可以传递参数,该参数的类型为adreturnValue
这里有个例子:
http://www.itraining.net.cn/lzh/article.asp?art_id=622

解决方案 »

  1.   

    应该是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();
    }
      

  2.   

    上面的兄弟看来和我经历了一样的摸索啊,对了,告诉大家一件事,就是要把记录集放在客户端,而不要选服务器端,要不然你的程序返回值永远都是零。
    补充一点,如果要做一个专门的调用存储过程的函数,可以不用adCmdStoredProc而用adCmdText这样你就可以用问号替代参数的位置,这样合成的调用适合很多场合,例如:
    pCmd->CommandText="{?=call sp_test(?,?)}",然后存储过程的名称可以合成,后面参数的个数也可以合成。上面的老兄错误返回处理的不好,如果要把COM里的错误返回还得另外写,还有把存储过程里的错误返回还需要一点技巧。今天心情不好,程序员太辛苦,受得罪太多,是个伪百领,地位和民工差不多。
    以后再和各位交流。
      

  3.   

    {?=call sp_Test}.
    junma(黑木凯) 真是英明多谢了