C++通过ADO调用存储过程时如果作为用于返回的参数所含的字符太多就会出错。解决思路

C++通过ADO调用存储过程时如果作为用于返回的参数所含的字符太多就会出错。
执行下面的代码就会报错。  
BOOL   AOracleDatabase::GetOfflineMsg   (CString   strReceiveId   ,   CString&   strMsgList   ,CString*   pErrMsg   )
{
//   ----------------------------
_ParameterPtr   parMsgList   ;  
parMsgList=pCommand-> CreateParameter   (_T( "strMsgList "),adVarChar,adParamOutput,16000   )   ;   //   make   sure   the   param
  is   large   enoguh   to   retreive   the   data     .  
hr   =   pCommand-> Parameters-> Append   (parMsgList   )   ;  
ASSERT(   FAILED   (hr)==FALSE   )   ;  
//   ----------------------------
try
{
//   ------------execution   -------------------------------------
pCommand-> ActiveConnection   =   m_pConnection   ;  
pCommand-> CommandText   =_T( "sp_getdelaymsg1 ")   ;  
pCommand-> CommandType   =   adCmdStoredProc   ;  
hr=pCommand-> Execute   (NULL,NULL,adCmdStoredProc   )   ;  
ASSERT(FAILED(hr)==FALSE   )   ;  
//   -----------------------

_variant_t   varMsgList   ;  
varMsgList   =   pCommand-> Parameters-> GetItem   (_T( "strMsgList "))-> GetValue   ()   ;  

}

create   or   replace   procedure   sp_getdelaymsg1   (strMsgList   out   varchar2   )   is
i   int   ;
begin

i   :=   0   ;  

loop
    i:=i+1;    
    if   i> 2024   then  
        exit;
    end   if;
    strMsgList   :=   strMsgList   +   'a '   ;       --   strMsgList   长度小的话就不会出错。  
end   loop;

end   sp_getdelaymsg1;


------解决方案--------------------
出什么错,看你调用存储过程的代码不象有问题

而且你字符窜短也是ok的

你把字符窜弄长无非就是把这个地方改一下,把2024改大一点咯

if i> 2024 then

在sp里面 循环值钱,也初始化一下你的这个output参数

select strMsgList = ' '

另外,你直接在数据库里的查询里跑这个sp,能ok吗