ado问题 我用一个_CommandPtr对象的Execute方法执行一个存储过程,返回一个_RecordsetPtr对象,这个结果记录集怎么只能MoveNext()不能MoveFirst(),如果我想这个记录集可能随便移动。该怎么办? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 应该是可以MoveFirst的随便移动是不行的只能靠MoveNext操作 应该是可以的,SQL Server数据库我试过是支持的。Oracle不支持直接返回记录集,得使用游标对象,比较麻烦。 关键代码如下: try { pParam = pCmd->CreateParameter(_T("strIn"),adVarChar,adParamInput,200,value); pCmd->Parameters->Append(pParam); pRs = pCmd->Execute(NULL,NULL,adCmdStoredProc ); } catch(_com_error &e) { if(pConn != NULL && pConn->GetState() == adStateOpen) { pConn->Close(); } if(pRs != NULL && pRs->GetState() == adStateOpen) { pRs->Close(); }#ifdef DEBUG PrintComError(e);#endif AfxMessageBox(_T("查询数据失败!")); return; } if(pRs == NULL) { if(pConn->GetState() == adStateOpen) { pConn->Close(); } AfxMessageBox(_T("查询数据发生未知错误!")); return; } long lCount = pRs->GetRecordCount(); if(lCount == -1) { lCount = 0; pRs->MoveFirst(); while(!pRs->IsEOF) { pRs->MoveNext(); lCount++; } } if(lCount < 1) { if(pConn != NULL && pConn->GetState() == adStateOpen) { pConn->Close(); } if(pRs != NULL && pRs->GetState() == adStateOpen) { pRs->Close(); } return; } //...... try { pRs->MoveFirst(); //这一步出现异常,异常信息:行集位置不能被重新启动(80040e18) } catch(_com_error &e) {#ifdef DEBUG PrintComError(e);#endif if(pConn != NULL && pConn->GetState() == adStateOpen) { pConn->Close(); } if(pRs != NULL && pRs->GetState() == adStateOpen) { pRs->Close(); } return; }是不是游标的问题?如果是,那么这种情况该怎么设置游标? 连的是sqlserver问题找到了,是游标的问题。Command.Execute返回的记录集游标类型默认为adForwordOnly,所以不支持向后移动。这个时候可能在连接对象里设置游标pConn->CursorLocation = adUseClient;结了 如何转换时间字符串(Sat, 15-Nov-38 06:28:36 GMT)? 关于一个绘图程序初始化共享的问题~~~~~~ 好大的雪呀~ 函数调用出错的 问题大家帮忙 如何删除硬盘上的一个录像文件? ListControl的使用方法!! 一个播放问题,急! 哪里有打包程序installshield for visual c++下载 画球 让我头疼的错误missing ';' before '*' ,什么意思? wince 6.0下UDP接收不到的问题 这是一个什么控件
随便移动是不行的只能靠MoveNext操作
{
pParam = pCmd->CreateParameter(_T("strIn"),adVarChar,adParamInput,200,value);
pCmd->Parameters->Append(pParam);
pRs = pCmd->Execute(NULL,NULL,adCmdStoredProc );
}
catch(_com_error &e)
{
if(pConn != NULL && pConn->GetState() == adStateOpen)
{
pConn->Close();
}
if(pRs != NULL && pRs->GetState() == adStateOpen)
{
pRs->Close();
}
#ifdef DEBUG
PrintComError(e);
#endif
AfxMessageBox(_T("查询数据失败!"));
return;
}
if(pRs == NULL)
{
if(pConn->GetState() == adStateOpen)
{
pConn->Close();
}
AfxMessageBox(_T("查询数据发生未知错误!"));
return;
} long lCount = pRs->GetRecordCount();
if(lCount == -1)
{
lCount = 0;
pRs->MoveFirst();
while(!pRs->IsEOF)
{
pRs->MoveNext();
lCount++;
}
}
if(lCount < 1)
{
if(pConn != NULL && pConn->GetState() == adStateOpen)
{
pConn->Close();
}
if(pRs != NULL && pRs->GetState() == adStateOpen)
{
pRs->Close();
}
return;
}
//......
try
{
pRs->MoveFirst(); //这一步出现异常,异常信息:行集位置不能被重新启动(80040e18)
}
catch(_com_error &e)
{
#ifdef DEBUG
PrintComError(e);
#endif
if(pConn != NULL && pConn->GetState() == adStateOpen)
{
pConn->Close();
}
if(pRs != NULL && pRs->GetState() == adStateOpen)
{
pRs->Close();
}
return;
}
是不是游标的问题?如果是,那么这种情况该怎么设置游标?
问题找到了,是游标的问题。
Command.Execute返回的记录集游标类型默认为adForwordOnly,所以不支持向后移动。
这个时候可能在连接对象里设置游标pConn->CursorLocation = adUseClient;
结了