以下是一个通过ADO调用存储过程的部分代码:
_CommandPtr cmmd; 
HRESULT hr = cmmd.CreateInstance(__uuidof(Command));  
if(FAILED(hr)) 
{   
AfxMessageBox("NewNetDatabase()中创建_CommandPtr对象失败");   
return 0;  
}  
_ParameterPtr param;  
param = cmmd->CreateParameter(""/*NetType*/,adTinyInt, adParamInput,sizeof(BYTE),(BYTE)(m_nNetType+1));  
cmmd->Parameters->Append(param);  
param = cmmd->CreateParameter(""/*Name*/,adVarChar, adParamInput,   m_strName.GetLength()+1, _variant_t(m_strName));  
cmmd->Parameters->Append(param);  
param = cmmd->CreateParameter(""/*Desp*/,adVarChar, adParamInput,   m_strDesp.GetLength()+1, _variant_t(m_strDesp));  
cmmd->Parameters->Append(param);  
param = cmmd->CreateParameter("NewNetID"/*NetID*/,adInteger, adParamOutput,   sizeof(long), (long)m_nNewNetID);
//返回参数,返回新建的网络的ID  
cmmd->Parameters->Append(param);   
cmmd->CommandText=_bstr_t("GSDT_NewNet");
//存储过程的名称  
cmmd->ActiveConnection = m_pConPtr;
//需要使用的ADO连接  
cmmd->CommandType=adCmdStoredProc;  
//注意下面的一行代码,如果你写成这样,就获得不了返回参数的值  
//_RecordsetPtr rec = cmmd->Execute(NULL, NULL, adCmdStoredProc);  //我不知道这是为什么,但事实就是这样:)  
cmmd->Execute(NULL, NULL, adCmdStoredProc);  
m_nNewNetID=(long)cmmd->Parameters->GetItem("NewNetID")->GetValue();//通过参数返回值  
cmmd.Detach();

解决方案 »

  1.   

    获取ourput参数是大家最关注的问题,同时也是最“难”的问题,因为按照书本上的写法,经常获得不了   
    Output参数,其实这个问题很容易解决:在调用_CommandPtr的Execute方法时,
    写成:   
    cmmd->Execute(NULL, NULL, adCmdStoredProc);   
    而不要写成   RecordsetPtr rec = cmmd->Execute(NULL, NULL, adCmdStoredProc);   
    也就是说,不取返回值(我不知道这是为什么,但是相信我,事情就是这样)。   
    这句执行完后,使用   cmmd->Parameters->GetItem("XXXXXX")->GetValue    ^^^^^^^  输出参数的名称   
    就可以获得输出参数的值了。
      

  2.   

    好象ADO不支持Microsoft Oracle OLEDB Provider and ODBC Drivers Do Not Support Passing Array Data Types (Q298965)
    http://support.microsoft.com/default.aspx?scid=kb;EN-US;q298965但这里有个ADO的脚本例子 (没试过是否工作):
    http://www.learnasp.com/learn/oraclerecordsetsado.asp