运行提示“对象打开时,不允许操作”,查了查,说是打开记录后需要关闭,否则再打开的话就提示这个错误。
但是我的程序时在一个函数里,需要操作数据库,但是在查出来的记录里需要调用一个函数转化一下,这个被调用的函数还是对数据库的操作,所以提示这个错误,请问我这种情况怎么修改呀?谢谢!
比如:
void CBand::show()
{
CString sql;
CString strpri,strpriid;
sql.Format("select * from flow");
打开数据库
strpri=数据库一字段内容;strpriid=numtoip(strpri); //numtoip是一个函数,里面也是对数据库的完整操作,因为好多地方用到,所以定义成函数……在CListCtrl控件中显示
}请问这样的情况怎么解决?
但是我的程序时在一个函数里,需要操作数据库,但是在查出来的记录里需要调用一个函数转化一下,这个被调用的函数还是对数据库的操作,所以提示这个错误,请问我这种情况怎么修改呀?谢谢!
比如:
void CBand::show()
{
CString sql;
CString strpri,strpriid;
sql.Format("select * from flow");
打开数据库
strpri=数据库一字段内容;strpriid=numtoip(strpri); //numtoip是一个函数,里面也是对数据库的完整操作,因为好多地方用到,所以定义成函数……在CListCtrl控件中显示
}请问这样的情况怎么解决?
void CBandwidthDlg::ShowList()
{
CString strSta,strDest,strpri,strBW,strSql,strID;
CString strStaIP,strDestIP;
m_list.DeleteAllItems();
try
{
strSql.Format("select * from flow");
BSTR bstrSQL = strSql.AllocSysString ();
db.m_pRecordset->Open(bstrSQL,(IDispatch*)db.m_pConnection,adOpenDynamic,adLockOptimistic,adCmdText); int i=0;
while(!db.m_pRecordset->adoEOF)
{
strID=(char*)_bstr_t(db.m_pRecordset->Fields->GetItem(_variant_t("ID"))->Value);
strSta=(char*)_bstr_t(db.m_pRecordset->Fields->GetItem(_variant_t("sta"))->Value);
strDest=(char*)_bstr_t(db.m_pRecordset->Fields->GetItem(_variant_t("dest"))->Value); strStaIP=NumtoIP(strSta);
strDestIP=NumtoIP(strDest); //插入列表框,并显示出来
m_list.InsertItem(i,"");
m_list.SetItemText(i,0,strID);
m_list.SetItemText(i,1,strStaIP);
m_list.SetItemText(i,2,strDestIP);
i++;
db.m_pRecordset->MoveNext();
}
db.m_pRecordset->Close();
}
catch(_com_error e)
{
AfxMessageBox(e.Description());
}
}
NumtoIP函数如下:
CString CBandwidthDlg::NumtoIP(CString num)
{
CString strIP;
try
{
CString cstring,strSql;
_variant_t TheValue;
strSql.Format("select * from IPTONUM where NUM = '%s'",num);
BSTR bstrSQL = strSql.AllocSysString ();
db.m_pRecordset->Open(bstrSQL,(IDispatch*)db.m_pConnection,adOpenDynamic,adLockOptimistic,adCmdText);
while (!db.m_pRecordset->adoEOF)
{
TheValue = db.m_pRecordset->Fields->GetItem("STRIP")->Value;
if(TheValue.vt!=VT_NULL)
{
cstring = (char*)_bstr_t(TheValue);
strIP=cstring;//atoi(cstring.GetBuffer(0));
}
db.m_pRecordset->MoveNext();
}
db.m_pRecordset->Close();
}
catch(_com_error e)
{
AfxMessageBox(e.Description());
}
return strIP;
}这样以调用就出现对象打开时不允许操作
请问怎么解决?
strStaIP=NumtoIP(strSta);
strDestIP=NumtoIP(strDest);
原因可能就是前边刚打开一个记录集,在这个函数里又需要打开,就提示出错了
应该怎么处理呀?
inline _bstr_t _com_error::Description() const throw(_com_error)
{
BSTR bstr = NULL;
if (m_perrinfo != NULL) {
m_perrinfo->GetDescription(&bstr);
}
return _bstr_t(bstr, false);
}执行完这个 db.m_pRecordset->Open(bstrSQL,(IDispatch*) db.m_pConnection,adOpenDynamic,adLockOptimistic,adCmdText);
直接跳转到
catch(_com_error e)
{
AfxMessageBox(e.Description());
}
既然同时用到select * from flow" 和"select * from IPTONUM where NUM = '%s'"两种记录集
那为何不干脆定义两个记录集??
未必需要db的成员,定义两个临时的记录集便可