作了一个小的信息管理系统,按照书上的源码输入,编译通过
但在运行时,如果要编辑一个记录的话,确定后确会报错.
基本内容如下:
Debug Assertion Failedfile:strex.cpp
Line:672一会儿编辑另一个记录又会报错说错在另一行(Line:512)
怎么回事啊??有没有调试方面的教材?

解决方案 »

  1.   

    找到哪一行Line:512)
    有个call stack看看是那个函数出错
      

  2.   

    很明显是数据库操作出错了,有几种可能,sql语句写错,更新出错等(比如ADO,忘了update()),最好能把编辑那部分的代码贴出来看下
      

  3.   

    编辑的代码:
    void CDemo02View::EditCurUser()
    {
    CListCtrl *ctl;
    ctl=&GetListCtrl();
    //Ñ°ÕÒλÖÃ
    POSITION pos=ctl->GetFirstSelectedItemPosition();
    if(pos==NULL)
    {
    //ûÓÐÍ˳ö
    AfxMessageBox("ÇëÏÈÑ¡ÖÐÒ»Ìõ¼Ç¼");
    return;
    }
    //»ñÈ¡µ±Ç°Î»ÖÃ
    int m_CurUser=ctl->GetNextSelectedItem(pos);
    //
    CUserDlg m_UserDlg;
    char chrTemp[21]={'\0'};
    ctl->GetItemText(m_CurUser,1,chrTemp,sizeof(char[20]));
    m_UserDlg.m_UserName=chrTemp;
    ctl->GetItemText(m_CurUser,2,chrTemp,sizeof(char[20]));
    m_UserDlg.m_UserPwd=chrTemp;
    ctl->GetItemText(m_CurUser,3,chrTemp,sizeof(char[20]));
    m_UserDlg.m_UserAble=chrTemp;
    ctl->GetItemText(m_CurUser,4,chrTemp,sizeof(char[4]));
    m_UserDlg.m_UserSex=chrTemp;
    ctl->GetItemText(m_CurUser,5,chrTemp,sizeof(char[50]));
    m_UserDlg.m_UserAddr=chrTemp;
    ctl->GetItemText(m_CurUser,6,chrTemp,sizeof(char[50]));
    m_UserDlg.m_UserDep=chrTemp;
    ctl->GetItemText(m_CurUser,7,chrTemp,sizeof(char[20]));
    m_UserDlg.m_UserTitle=chrTemp;
    ctl->GetItemText(m_CurUser,8,chrTemp,sizeof(char[50]));
    m_UserDlg.m_UserEmail=chrTemp;
    ctl->GetItemText(m_CurUser,9,chrTemp,sizeof(char[20]));
    m_UserDlg.m_UserPhone=chrTemp;
    ctl->GetItemText(m_CurUser,10,chrTemp,sizeof(char[20]));
    m_UserDlg.m_UserInfo=chrTemp;
    //update
    // m_UserDlg.DoModal(); //m_UserDlg.m_UserInfo=chrTemp;
    m_UserDlg.m_Title="ÐÞ¸ÄÓû§ÐÅÏ¢";
    if(m_UserDlg.DoModal()!=IDOK)
    {
    return;
    }
    //Èç¹ûÈ·¶¨ÁËÑ¡Ôñ
    ctl->GetItemText(m_CurUser,0,chrTemp,sizeof(char[20]));
    //½«Óû§IDת»»ÎªÕýÊý±£´æ,ºóÃæµÄÊý¾Ý¿â²Ù×÷ÒÑ´ËΪÌõ¼þ
    int m_CurUserID=atoi(chrTemp);
    CUserRecordSet m_UserRecordSet;
    try
    {
    if(m_UserRecordSet.IsOpen())
    m_UserRecordSet.Close();
    //Æ¥ÅäÌõ¼þUserID=m_CuruserID
    m_UserRecordSet.m_strFilter.Format("UserID='%' order by UserID",m_CurUserID);
    m_UserRecordSet.Open(CRecordset::snapshot,NULL,CRecordset::none);
    //Èç¹ûÓû§¼Ç¼´æÔÚ,½øÐÐÐÞ¸Ä
    if(m_UserRecordSet.Open()&&!m_UserRecordSet.IsEOF())
    {
    //ÉèÖñ༭µ±Ç°¼Ç¼
    m_UserRecordSet.Edit();
    //¿ªÊ¼±à¼­
    m_UserRecordSet.m_UserAble=m_UserDlg.m_UserAble;
    m_UserRecordSet.m_UserAddr=m_UserDlg.m_UserAddr;
    m_UserRecordSet.m_UserDep=m_UserDlg.m_UserDep;
    m_UserRecordSet.m_UserEmail=m_UserDlg.m_UserEmail;
    m_UserRecordSet.m_UserInfo=m_UserDlg.m_UserEmail;
    m_UserRecordSet.m_UserName=m_UserDlg.m_UserName;
    m_UserRecordSet.m_UserPhone=m_UserDlg.m_UserPhone;
    m_UserRecordSet.m_UserPwd=m_UserDlg.m_UserPwd;
    m_UserRecordSet.m_UserSex=m_UserDlg.m_UserSex;
    m_UserRecordSet.m_UserTitle=m_UserDlg.m_UserTitle;
    //¸üе½Êý¾Ý¿âÖÐ
    if(m_UserRecordSet.CanUpdate())
    {
    m_UserRecordSet.Update();
    }
    //¹Ø±Õ¼Ç¼¼°
    if(m_UserRecordSet.IsOpen())
    m_UserRecordSet.Close();
    AfxMessageBox("Ð޸ijɹ¦!");
    }
    else //¿¼ÂÇÌØÁÐ,Èç¹û²Ù×÷ÖÐÓû§ÐÅÏ¢²»´æÔÚÁË
    {
    //close database
    if(m_UserRecordSet.IsOpen())
    m_UserRecordSet.Close();
    //ÌáʾÓû§
    AfxMessageBox("¸Ã¼Ç¼²»´æÔÚ,ÎÞ´ÓÐÞ¸Ä!");
    return;
    }
    }
    catch(CDBException* e)
    {
    e->ReportError();
    return;
    }
    //Èç¹û´¦Àíµ½ÕâÀï,ÄÇ´¦ÀíÐ޸ĺó²»ÄÜÂíÉÏ¿´µ½½á¹û
    //ËùÒÔ»¹Òª½«Óû§ÐÅÏ¢¼°Ê±¸üе½ListCtrlÖÐ
    ctl->SetItemText(m_CurUser,1,m_UserDlg.m_UserName);
    ctl->SetItemText(m_CurUser,2,m_UserDlg.m_UserPwd);
    ctl->SetItemText(m_CurUser,3,m_UserDlg.m_UserAble);
    ctl->SetItemText(m_CurUser,5,m_UserDlg.m_UserDep);
    ctl->SetItemText(m_CurUser,6,m_UserDlg.m_UserAddr);
    ctl->SetItemText(m_CurUser,4,m_UserDlg.m_UserSex);
    ctl->SetItemText(m_CurUser,7,m_UserDlg.m_UserTitle);
    ctl->SetItemText(m_CurUser,8,m_UserDlg.m_UserEmail);
    ctl->SetItemText(m_CurUser,9,m_UserDlg.m_UserPhone);
    ctl->SetItemText(m_CurUser,10,m_UserDlg.m_UserInfo);}
      

  4.   

    还没看完,已经找到个错误
    m_UserRecordSet.m_strFilter.Format("UserID='%' order by UserID",m_CurUserID);
    这个format写错了,"UserID='%'没标明数据类型
      

  5.   

    ctl->GetItemText(m_CurUser,1,chrTemp,sizeof(char[20]));
    m_UserDlg.m_UserName=chrTemp;
    ctl->GetItemText(m_CurUser,2,chrTemp,sizeof(char[20]));
    m_UserDlg.m_UserPwd=chrTemp;
    每次GetItemText的时候先清空,避免无效数据。
      

  6.   

    比如
    ctl->GetItemText(m_CurUser,1,chrTemp,sizeof(char[20]));
    m_UserDlg.m_UserName=chrTemp;
    ctl->GetItemText(m_CurUser,2,chrTemp,sizeof(char[20]));
    memset(chTemp, 0, 21);sizeof(char〔50〕),比chrTemp还大,会造成溢出,很容易crash, chrTemp需要大一些,要大于你需要得到字符串长度。