小弟最近写了个接口程序,将采集到的信息写入数据库,数据库用的是SQL SERVER 2000,
数据库类继承CRecordset,snapshot,写库到几万条后(每条信息只有14个字节),任务管理器中显示
程序占用CPU资源很高,程序响应变慢,但内存资源占用正常。如果清空数据库,程序又恢复正常,
初学vc,还请高手指点,是何原因造成的。
另:改为dynaset,写库时程序出错,“记录集为只读”。程序中写库相关代码如下:
BOOL CGISDlg::OnInitDialog()
{
CDialog::OnInitDialog();
        m_pSet= new CSQLDB;
TRY
{
if (!m_pSet->Open())
m_pSet->Open();
if(m_pSet->GetRecordCount()==0)
m_DataID=0;
else
{
long max=0;
m_pSet->MoveFirst();
do
{
if(m_pSet->m_Data_ID>max)
max=m_pSet->m_Data_ID;
m_pSet->MoveNext();
}
while(!m_pSet->IsEOF());
m_DataID=max;
}
m_DataID++;
       }
CATCH(CDBException,pEX)
{
pEX->ReportError();
m_pSet=NULL;
return false;
}
END_CATCH
}void CGISDlg::ProcessRead(CRecData &recData)
{
        m_pSet->AddNew();
m_pSet->m_Data_ID=m_DataID++;
m_pSet->m_Func=recData.m_Fc;
m_pSet->m_Road_ID=recData.m_LineNo;
m_pSet->m_Bus_ID=recData.m_BusNo;
m_pSet->m_Stop_ID=recData.m_StopNo;
m_pSet->m_Direction=recData.m_Direction;
m_pSet->m_Meters=recData.m_Meters;
m_pSet->m_Guest_Num=recData.m_Guest_Num;
m_pSet->m_Speeds=recData.m_Speeds;
m_pSet->m_Warn_symbol=recData.m_Warn_symbol;
m_pSet->m_Occur_Time=recData.m_Occur_Time;
m_pSet->Update();
m_pSet->Requery();
}CSQLDB::CSQLDB(CDatabase* pdb)
: CRecordset(pdb)
{
//{{AFX_FIELD_INIT(CSQLDB)
m_Data_ID = 0;
m_Func = _T("");
m_Road_ID = 0;
m_Bus_ID = 0;
m_Stop_ID = 0;
m_Direction = FALSE;
m_Meters = 0;
m_Guest_Num = 0;
m_Speeds = 0;
m_Warn_symbol = _T("");
m_nFields = 11;
//}}AFX_FIELD_INIT
m_nDefaultType = snapshot;
}
CString CSQLDB::GetDefaultConnect()
{
return _T("ODBC;DSN=GIS;UID=sa;PWD=cqbus");
}CString CSQLDB::GetDefaultSQL()
{
return _T("[dbo].[Orig_table]");
}

解决方案 »

  1.   

    do
    {
    if(m_pSet->m_Data_ID>max)
    max=m_pSet->m_Data_ID;
    m_pSet->MoveNext();
    }
    while(!m_pSet->IsEOF());这个循环为什么不用SQL来做。
      

  2.   

    dynaset这个选项在哪里用的啊?
      

  3.   

    感谢关注,现在发现个问题,是不是m_pSet->Requery();让程序的效率降低了?现在用的是snapshot方式
    CSQLDB::CSQLDB(CDatabase* pdb)
    : CRecordset(pdb)
    {
    //{{AFX_FIELD_INIT(CSQLDB)
    m_Data_ID = 0;
    m_Func = _T("");
    m_Road_ID = 0;
    m_Bus_ID = 0;
    m_Stop_ID = 0;
    m_Direction = FALSE;
    m_Meters = 0;
    m_Guest_Num = 0;
    m_Speeds = 0;
    m_Warn_symbol = _T("");
    m_nFields = 11;
    //}}AFX_FIELD_INIT
    m_nDefaultType = snapshot;
    }