一个关于ADO的问题

hawkcat 2005-08-19 10:39:16
代码如下:

执行到int count=m_pRe->RecordCount 时出错,
发现是m_pRe=m_pCmd->Execute (NULL,NULL ,adCmdStoredProc),Execute返回的数据集没有打开
我查过msdn,解释为如果Execute执行的结果返回的不是行数据的话,Record集就不会打开。

用sqlserver的事件分析器查过调用的存储过程GI_Get_EnquiryTree,执行结果是正确的,返回了多行数据。

请问为何该函数里调用该存储过程却没有返回多行数据,会是什么原因造成的。

大侠们救命啊,查了一天了没查出问题来。


STDMETHODIMP CFFDAdoCom::GetEnqueryTree(LPSTR strLogName, VARARRAY **pEnqueryInfoTree)
{
// TODO: Add your implementation code here
_bstr_t bstrProc=(L"GI_Get_EnquiryTree");
_variant_t Final;

try
{
if(m_pCnn==0)
return 0;
if(m_pCnn->State ==adStateOpen)
{
_CommandPtr m_pCmd;
m_pCmd.CreateInstance(__uuidof(Command));
if(m_pCmd==0)
return 0;
if(m_pRe==0)
m_pRe.CreateInstance(__uuidof(Recordset));
if(m_pRe==0)
return 0;
if(m_pRe->State==adStateOpen)
m_pRe->Close();
m_pCmd->ActiveConnection =m_pCnn;
m_pCmd->CommandText =_bstr_t(bstrProc);
m_pCmd->CommandType=adCmdStoredProc;
_ParameterPtr para;
para=m_pCmd->CreateParameter ("RETVAL",adInteger,adParamReturnValue,sizeof(int),vtMissing);
m_pCmd->Parameters ->Append (para);

para=m_pCmd->CreateParameter ("@strLog_Name",adVarChar,adParamInput,20,_variant_t(strLogName));
m_pCmd->Parameters ->Append (para);

m_pRe=m_pCmd->Execute (NULL,NULL ,adCmdStoredProc);
int res=0;
res=m_pCmd->Parameters ->GetItem((_variant_t)(long)0)->GetValue().intVal ;

if(res!=1)
{
*pEnqueryInfoTree=0;
return 0;
}
int count=m_pRe->RecordCount ;

//执行到这里出错。原因是m_pRe没有打开
if(count==0)
{
m_pRe->Close();
*pEnqueryInfoTree=0;
return 0;
}
*pEnqueryInfoTree=0;
*pEnqueryInfoTree=(VARARRAY *)CoTaskMemAlloc(sizeof(VARARRAY)+sizeof(ENQUERYTREEINFO)*count);
if(*pEnqueryInfoTree==0)
{
m_pRe->Close();
return 0;
}
(*pEnqueryInfoTree)->pEnqueryTreeInfo=(ENQUERYTREEINFO *)((char *)(*pEnqueryInfoTree)+sizeof(VARARRAY));
(*pEnqueryInfoTree)->nArrayNum=count;
(*pEnqueryInfoTree)->ArrayType=VT_ENQUERYTREEINFO;

for(int i=0;i<count;i++)
{
(*pEnqueryInfoTree)->pEnqueryTreeInfo[i].nItem_ID=(long)m_pRe->Fields->GetItem((_variant_t)(long)0)->GetValue();
(*pEnqueryInfoTree)->pEnqueryTreeInfo[i].nParent_ID=(long)m_pRe->Fields->GetItem((_variant_t)(long)1)->GetValue();
(*pEnqueryInfoTree)->pEnqueryTreeInfo[i].nChild_Num=(short)m_pRe->Fields->GetItem((_variant_t)(long)2)->GetValue();
strcpy((char *)(*pEnqueryInfoTree)->pEnqueryTreeInfo[i].strChild_ID,(char *)(_bstr_t)m_pRe->Fields ->GetItem ((_variant_t)(long)3)->GetValue ());
strcpy((char *)(*pEnqueryInfoTree)->pEnqueryTreeInfo[i].strDescription,(char *)(_bstr_t)m_pRe->Fields ->GetItem ((_variant_t)(long)5)->GetValue ());
m_pRe->MoveNext ();
}
m_pRe->Close();
return 1;
}
else
return 0;
}
catch(_com_error &e)
{
if(m_bShowErrorInfo)
MessageBox(0,e.Description (),"GetClassMemInfo error",MB_OK);
DealError(1);
return 0;
}
catch(...)
{
DealError(0);
return 0;
}
return 0 ;
}

...全文
66 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
hawkcat 2005-08-20
  • 打赏
  • 举报
回复
在其他机子上是运行成功的,但是在我的机子上就是不行。存储过程执行是对的,对表的修改也成功的,就最后没有返回结果集。
hawkcat 2005-08-20
  • 打赏
  • 举报
回复
最后是
select INFO_ID,INPARENT_ID,INCHILD_NUM,INCHILD_ID,IN_DESCRIPTION from GI_QueryTreeInfo
klan 2005-08-19
  • 打赏
  • 举报
回复
你的存储过程最后怎么写的?怎么返回的?

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧