运行提示“对象打开时,不允许操作”,查了查,说是打开记录后需要关闭,否则再打开的话就提示这个错误。
但是我的程序时在一个函数里,需要操作数据库,但是在查出来的记录里需要调用一个函数转化一下,这个被调用的函数还是对数据库的操作,所以提示这个错误,请问我这种情况怎么修改呀?谢谢!
比如:
void CBand::show()
{
CString sql;
CString strpri,strpriid;
sql.Format("select * from flow");
打开数据库
strpri=数据库一字段内容;strpriid=numtoip(strpri);   //numtoip是一个函数,里面也是对数据库的完整操作,因为好多地方用到,所以定义成函数……在CListCtrl控件中显示
}请问这样的情况怎么解决?

解决方案 »

  1.   

    请问tabby:意思是我在strpriid=numtoip(strpri);  函数中不用打开记录集,而是仅对数据库变量进行操作,等调用的时候再打开数据库记录集调用函数吗?
      

  2.   

    我的代码如下:
    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;
    }这样以调用就出现对象打开时不允许操作
    请问怎么解决?
      

  3.   

    就是在这句出错
    strStaIP=NumtoIP(strSta); 
    strDestIP=NumtoIP(strDest); 
    原因可能就是前边刚打开一个记录集,在这个函数里又需要打开,就提示出错了
      

  4.   

    我在函数NumtoIP(strSta)里不打开记录集操作的话,关闭的时候又提示对象关闭时,不允许操作
    应该怎么处理呀? 
      

  5.   

    你要调试到NumtoIP函数内部去,定位到系统函数出错的地方。。
      

  6.   

    这个吗
    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()); 

      

  7.   


    既然同时用到select * from flow" 和"select * from IPTONUM where NUM = '%s'"两种记录集
    那为何不干脆定义两个记录集??
    未必需要db的成员,定义两个临时的记录集便可