void CZyView::OnDraw(CDC* pDC)
{
int a=1;
int buffer[60];
CString str[60],id,sj;
CZyDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open("SELECT * FROM TABLE1",_variant_t((IDispatch*)m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdUnknown);
m_pRecordset->MoveFirst();///移到首条记录

while(!m_pRecordset->adoEOF)
{
int tt1,tt2;
tt1 = m_pRecordset->GetCollect("帧数").iVal;///取得帧数字段的值
    tt2=m_pRecordset->GetCollect("数据正文字节数").iVal;
id.Format("%d",tt1);
    sj.Format("%d",tt2);
  for(int i=1;i<55;i++)
{
  

        buffer[i-1]=m_pRecordset->GetCollect("i").iVal;
str[i-1].Format("%d",buffer[i-1]);
pDC->TextOut(20*(i+3),20*a,str[i-1]);
}
pDC->TextOut(1,20*a,id);
pDC->TextOut(20,20*a,sj); m_pRecordset->MoveNext();///移到下一条记录
a++;

}
char* pFileName="test.dat";
TRY
{
file.Open(pFileName,CFile::modeCreate|CFile::modeReadWrite);
file.Write(&id,sizeof(__int32));
file.Write(&sj,sizeof(__int32));
for(int i=0;i<54;i++)
{
file.Write(&str[i],sizeof(__int32));
}
}
CATCH(CFileException,e)
{
#ifdef _DEBUG
afxDump<<"File could not be opened"<<e->m_cause<<"\n";
#endif
}
END_CATCH


}
从数据库里读出数据并在视图中显示,可一改变视图大小就报错,为什么??

解决方案 »

  1.   

    OnDraw是由OnPaint调用来响应WM_PAINT消息的,代码应该可以重入才行,WM_PAINT在很多情况下都会由系统发出,比如改变大小等等。你肯定你的代码反复执行都正确吗,我看
    m_pRecordset.CreateInstance("ADODB.Recordset");
    。。
    m_pRecordset->Open
    每次都要建立和open吗,可以在执行前检测一下,否则肯定错。
      

  2.   

    同意楼上的见解。
    你最好这样:
    1. 把数据库的读取放到文档类的某个函数中,假设为ReadDataFromDB()。从数据库中读取的数据保存到文档类的某个成员变量中,假设为m_lstData;
    2. 在OnDraw中,通过访问GetDocument()->m_lstData来显示数据。因为在每一次视图窗口需要重画时都会调用OnDraw,所以你不必频繁访问数据库。
    3. 在文档类中适当的地方(譬如OnOpenDocument中)或者在需要更新数据的其他地方,调用
       CMyDocument::ReadDataFromDB,以刷新数据。
    4. 在刷新数据时别忘了刷新视图窗口(调用CMyView::InvalidateRect(0))
      

  3.   

    ondraw里面应该只处理和显示相关的内容,数据库管理最好放在文档当中。
      

  4.   

    你这样也行,只是回很慢,出错可能因为你只open没有close
      

  5.   

    EricHxy(龙真) 那我在视图的初始化函数中执行这段代码行吗?
     9712210(9712210) Mackz(在相互) ,我在关闭视图的时候都close了的。
      

  6.   

    尝试一下这样,和另一个程序(要覆盖到视图)反复切换,如果不出错,那错误就不在CRecorderset类上