如: 
  存在一存储过程aaa 
SQL codeCREATE PROCEDURE aaa
(
in p1 int,
inout p2 int,
out p3 int
)
language sql
begin
set p2 = p2+p1;
set p3 = p1;
end
我是这样调用的:
 
_variant_t    RecordsAffected; 
m_pConnection->CommandTimeout = 30; 
try 

    m_pConnection->Execute((_bstr_t)strsql, &RecordsAffected, adCmdText ); 
            //strsql为:"{call AAA(1,2,?)}" 

catch (_com_error e) 

        。 
} 捕获异常为: 参数数目错误 如果我将strsql改为:{call AAA(1,2)} 
这样异常为:未找到类型为"PROCEDURE" 命名为 "AAA" 且具有兼容自变量的已授权例程 哪位大哥指点下  谢谢了

解决方案 »

  1.   

    一个VC调用存储过程的例子:
    BOOL CDBImp::AddAISDynamicInfo(AIS_DYNAMICINFO &ad)
    {
    try
    {
    _CommandPtr cmmd;
    _ParameterPtr param;
    HRESULT hr = cmmd.CreateInstance(__uuidof(Command));
    if(FAILED(hr))
    {
    MakeLog("AddAISDynamicInfo,创建_CommandPtr对象失败。","A");
    return FALSE;
    }
    cmmd->ActiveConnection = m_piConnection;
    cmmd->CommandType = adCmdStoredProc;
    cmmd->CommandText = _bstr_t("P_ADDAISDYNAMICINFO");
    //
    param = cmmd->CreateParameter("",adChar,adParamInput,ad.sFromAIS_MMSI.GetLength() + 1,_variant_t(ad.sFromAIS_MMSI));
    cmmd->Parameters->Append(param);
    param = cmmd->CreateParameter("",adChar,adParamInput,ad.sMMSIID.GetLength() + 1,_variant_t(ad.sMMSIID));
    cmmd->Parameters->Append(param);
    param = cmmd->CreateParameter("",adTinyInt,adParamInput,sizeof(BYTE),(BYTE)ad.nNavStatus);
    cmmd->Parameters->Append(param);
    param = cmmd->CreateParameter("",adDouble,adParamInput,sizeof(double),ad.dSog);
    cmmd->Parameters->Append(param);
    param = cmmd->CreateParameter("",adDouble,adParamInput,sizeof(double),ad.dCog);
    cmmd->Parameters->Append(param);
    param = cmmd->CreateParameter("",adInteger,adParamInput,sizeof(long),ad.lRot);
    cmmd->Parameters->Append(param);
    param = cmmd->CreateParameter("",adDouble,adParamInput,sizeof(double),ad.dLongitude);
    cmmd->Parameters->Append(param);
    param = cmmd->CreateParameter("",adDouble,adParamInput,sizeof(double),ad.dLatitude);
    cmmd->Parameters->Append(param);
    param = cmmd->CreateParameter("",adTinyInt,adParamInput,sizeof(BYTE),(BYTE)(ad.lPosAcu));
    cmmd->Parameters->Append(param);
    param = cmmd->CreateParameter("",adInteger,adParamInput,sizeof(long),ad.lTrueHeading);
    cmmd->Parameters->Append(param);
    param = cmmd->CreateParameter("",adChar,adParamInput,ad.sReptTime.GetLength() + 1,_variant_t(ad.sReptTime));
    cmmd->Parameters->Append(param);
    //
    cmmd->Execute(NULL,NULL,adCmdStoredProc);
    }
    catch(_com_error e)
    {
    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());
    MakeLog("添加AIS动态信息失败。","E");
    DisConnect();
    return FALSE;
    }

    return TRUE;
    }
      

  2.   


    DB2调用存储过程是用CALL。
      

  3.   

    CALL是你在DB2中这么调用的吧。用ADO调用与在DB2界面中操作是两码事。
      

  4.   


    在DB2那命令编辑器里面调用存储过程的确是用的CALL我刚刚试下
    代码如下:
    _CommandPtr cmd;
    cmd.CreateInstance("ADODB.Command");
    ParametersPtr pParamRk;
    pParamRk = cmd->GetParameters();

    int p1 = 1, p2=2;
      pParamRk->Append(cmd->CreateParameter(_bstr_t("p1"), adBSTR, adParamInput, 4, (_variant_t)(long)(p1)));
    pParamRk->Append(cmd->CreateParameter(_bstr_t("p2"), adBSTR, adParamInput, 4, (_variant_t)(long)(p2))); try
    {
    cmd->CommandTimeout = 5;
    cmd->ActiveConnection = m_pConnection;
    cmd->CommandText = (_bstr_t)strProName;   //strProName为存储过程名 在此处即为"aaa"               
    cmd->CommandType = adCmdStoredProc

    cmd->Execute(NULL, NULL, adCmdStoredProc);
    }
    catch(_com_error &e)
    {
    CString strErrDescribe;
    strErrDescribe.Format("Exception thrown for classes generated by #import"
    "\tCode = %81x\n"
    "\tCode meaning = %s\n"
    "\tSource = %s\n"
    "\tDescription = %s\n",
    e.Error(),
    e.ErrorMessage(),
    (LPCTSTR)(e.Source()),
    (LPCTSTR)(e.Description()));
    TRACE("%s  %s\r\n", (LPCTSTR)e.Source(),(LPCSTR)e.Description());
    }
    怎么还是有问题呢,捕获异常为:类型名称无效
    也不知道那个类型不对。
    谢谢鹦鹉
      

  5.   

    你的参数明明是int型,为什么定义参数的时候,用adBSTR呢。用adInteger试试。
      

  6.   


    应该是adInteger,之前是手误了。
    不过现在改成adInteger了,还是有异常:未找到类型为"PROCEDURE" 命名为 "AAA" 且具有兼容自变量的已授权例程。SQLSTATUS=42884怎么会是这样呢?数据库存在该存储过程,怎么说找不着呢?谢谢了  非常感谢鹦鹉大哥一直的关注
      

  7.   

    网上也搜了下  也有人遇到类似的问题
    如:http://topic.csdn.net/t/20040105/20/2636064.html不过我call调用该存储过程没问题,但是ADO就有问题了,。
    我是用管理员账户db2admin登陆的,对各存储过程也有授权,可是不明白怎么还是有问题
      

  8.   

    你这个存储过程的模式名应该不是db2admin,应该是administrator,你执行call administrator.存储过程名(参数)试下。
      

  9.   


    我在9楼有说过  在命令编辑器用CALL调用没问题 但是ADL有问题db2admin是默认的管理员权限,而且都该数据库所有表啊,存储过程啊都有权限