读书人

C++通过ADO调用存储过程时如果作为用于

发布时间: 2012-02-28 13:06:36 作者: rapoo

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吗

读书人网 >VC/MFC

热点推荐