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吗
执行下面的代码就会报错。
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吗