读书人

ADO多次调用存储过程有关问题

发布时间: 2013-08-01 15:23:18 作者: rapoo

ADO多次调用存储过程问题
最近写连数据库相关的问题,碰到连续调用SP的时候,老是出问题,请教各位大牛帮我看看,谢谢了!
代码如下:


// Create Connect
BOOL OnInitADOConn()
{
::CoInitialize(NULL);
try
{
m_pConnection.CreateInstance("ADODB.Connection");
CStringstrConnect;
strConnect = _T("Provider=SQLOLEDB.1");
strConnect += _T(";Password=")+m_DbInfo.csPassward;
strConnect += _T(";Persist Security Info=True");
strConnect += _T(";User ID=")+m_DbInfo.csUSerName;
strConnect += _T(";Initial Catalog=")+m_DbInfo.csDBName;
strConnect += _T(";Data Source=")+m_DbInfo.csDataSource;
strConnect += _T("\n;");

m_pConnection->Open(strConnect.GetBuffer(strConnect.GetLength()+1),"","",adModeUnknown);
return TRUE;
}
catch (_com_error e)
{
CString str = e.Description();
errorMsg = &str;
AfxMessageBox(e.Description());
return FALSE;
}

// Create Command
// 循环调用时,会重新配置commText
try
{
if (!m_pADOComm)
{
CreateADOComm();
// set command type to stored process
m_pADOComm->CommandType = adCmdStoredProc;
m_pADOComm->ActiveConnection = m_pConnection;
m_pConnection->CursorLocation = adUseClient;
}
m_pADOComm->CommandText = commText;// SP name from Database
}
catch (_com_error e)
{
AfxMessageBox(e.Description());
return FALSE;
}
return TRUE;

// Add parameter to command

// 删除上次Command的Parameter的变量,循环调用时要重新配置参数...
InitAdoCommForSP()
{
long nParcount = 0;
m_AdoConn->m_pADOComm->Parameters->get_Count(&nParcount);
if (nParcount > 0)
{
m_AdoConn->ReleaseADOCommParamer();
}
_ParameterPtr pParm = NULL;

int lenth = 10;
_bstr_t strParmVal;
strParmVal = (_bstr_t)csSrcLang;
// Set source language to the command of the ADO
pParm = m_AdoConn->m_pADOComm->CreateParameter("@source_language",adVarChar,adParamInput,lenth,strParmVal);
m_AdoConn->AddParamToCom(pParm);

strParmVal = (_bstr_t)m_desLangArray[nDesLIndex].csLangCode;
pParm = m_AdoConn->m_pADOComm->CreateParameter("@desc_language",adVarChar,adParamInput,lenth,strParmVal);
m_AdoConn->AddParamToCom(pParm);

remap_flag_1 = 1;


remap_flag_2 = 4;
// Set remap_flag range to the command of the ADO
pParm = m_AdoConn->m_pADOComm->CreateParameter("@remap_flag_1",adInteger,adParamInput,sizeof(int),remap_flag_1);
m_AdoConn->AddParamToCom(pParm);

pParm = m_AdoConn->m_pADOComm->CreateParameter("@remap_flag_2",adInteger,adParamInput,sizeof(int),remap_flag_2);
m_AdoConn->AddParamToCom(pParm);

strMarker = "BANZ";
pParm = m_AdoConn->m_pADOComm->CreateParameter("@maker",adVarChar,adParamInput,max_vehicle_str_len,strMarker);
m_AdoConn->AddParamToCom(pParm);
}

// m_AdoConn的ComExcute
_RecordsetPtr& ADOConn::ComExcute()
{
if (!m_pRecordset)
{
m_pRecordset.CreateInstance(__uuidof(Recordset));
}
try{
m_pRecordset = m_pADOComm->Execute(NULL,NULL,adCmdStoredProc);
}
catch(_com_error e)
{
AfxMessageBox(e.Description());
}
return m_pRecordset;
}
// 多次调用的代码
// 用户每次点击动作会调用下面的代码:
InitAdoCommForSP();

// Get the result assemble from the db
_pRecordset = m_AdoConn->ComExcute();
int nCountRet = _pRecordset->GetRecordCount();



出错信息如下:
The connection cannot be used to perform this operation. It is either closed or invalid in this context.

执行完ComExcute之后,如果结果集_pRecordset的结果个数为0,那么再调用是没有问题的,否则就报错,我怀疑是由于没有释放_pRecordset的原因,但是我调用close释放_pRecordset就出错...哪位高人指导一下!
[解决办法]
什么情况?刚看到,已处于半退休状态啦

读书人网 >C++

热点推荐