我加了一个odbc的动态集类然后在对话框中
BOOL CMnCourseSalaDlg::OnInitDialog() 
{
CDialog::OnInitDialog();

// TODO: Add extra initialization here
if (m_CourseSalaSet.IsOpen()) 
{
m_CourseSalaSet.Close();
}
m_CourseSalaSet.Open();//此时,出现断言错误

}我按重试,断言出现在
文件:c:\...\vc98\mfc\include\afx.inl
// CString
_AFX_INLINE CStringData* CString::GetData() const
{ ASSERT(m_pchData != NULL); return ((CStringData*)m_pchData)-1; }怎么回事?

解决方案 »

  1.   

    呵呵,这肯定是没有初始化的问题了,加上这句话试一下
    m_CourseSalaSet = new CCourseSalaSet()
      

  2.   

    xindao_wang(小日本都是猪) :
    我只是把m_CourseSalaSet声明为类对象的数据成员,而不是类对象的指针的数据成员,所以加上
    m_CourseSalaSet = new CCourseSalaSet()
    肯定出错。按照c++的语法,类对象的数据成员会调用缺省的构造函数的。
      

  3.   

    既然知道
    _AFX_INLINE CStringData* CString::GetData() const
    { ASSERT(m_pchData != NULL); return ((CStringData*)m_pchData)-1; }
    就反推回去啊,这个字符串为什么是空的,是不是Open函数里需要使用的什么字符串忘记给值了?
      

  4.   

    我看了一下callstack,情况如下:
    CString::GetData() line 122 + 34 bytes
    CString::operator=(const CString & {""}) line 325 + 37 bytes
    CRecordset::SetState(int -1, const char * 0x00000000, unsigned long 0) line 2269
    CRecordset::Open(unsigned int 4294967295, const char * 0x00000000, unsigned long 0) line 1082
    CMnCourseSalaDlg::OnInitDialog() line 55 + 29 bytes我打开另1个表的时候,没有出现断言,callstack如下:
    CString::GetData() line 122
    CString::AllocBeforeWrite(int 8) line 197 + 8 bytes
    CString::AssignCopy(int 8, const char * 0x0012f578) line 315
    CString::operator=(const char * 0x0012f578) line 346
    CString::LoadStringA(unsigned int 57346) line 39
    CLoginDlg::OnInitDialog() line 70
      

  5.   

    CString::GetData() line 122
    CString::AllocBeforeWrite(int 0) line 197 + 8 bytes
    CString::AssignCopy(int 0, const char * 0x00000000) line 315
    CString::operator=(const char * 0x00000000) line 346
    CRecordset::SetState(int -1, const char * 0x00000000, unsigned long 0) line 2268
    CRecordset::Open(unsigned int 4294967295, const char * 0x00000000, unsigned long 0) line 1082
    CLoginDlg::OnInitDialog() line 80 + 23 bytes
      

  6.   

    我在同一个工程里面,用同样的方法打开另外一个表,没有什么问题,callstack如下:
    CString::GetData() line 122
    CString::AllocBeforeWrite(int 0) line 197 + 8 bytes
    CString::AssignCopy(int 0, const char * 0x00000000) line 315
    CString::operator=(const char * 0x00000000) line 346
    CRecordset::SetState(int -1, const char * 0x00000000, unsigned long 0) line 2268
    CRecordset::Open(unsigned int 4294967295, const char * 0x00000000, unsigned long 0) line 1082
    CLoginDlg::OnInitDialog() line 80 + 23 bytes
    AfxDlgProc(HWND__ * 0x004905fe, unsigned int 272, unsigned int 853520, unsigned int 853520) line 35 + 14 bytes
    代码如下:
    BOOL CLoginDlg::OnInitDialog() 
    {
    CDialog::OnInitDialog();

    // TODO: Add extra initialization here
    CString strTemp;
    strTemp.LoadString(IDS_COMMON_USER);
    m_comboBox.InsertString(-1, strTemp);
    strTemp.LoadString(IDS_ADMINISTRATOR);
    m_comboBox.InsertString(-1, strTemp); m_comboBox.SetCurSel(0); if (m_userSet.IsOpen()) 
    {
    m_userSet.Close();
    }
    m_userSet.Open();

    return TRUE;  // return TRUE unless you set the focus to a control
    }打开这个就有断言,callstack如下:
    CString::GetData() line 122
    CString::AllocBeforeWrite(int 0) line 197 + 8 bytes
    CString::AssignCopy(int 0, const char * 0x00000000) line 315
    CString::operator=(const char * 0x00000000) line 346
    CRecordset::SetState(int -1, const char * 0x00000000, unsigned long 0) line 2268
    CRecordset::Open(unsigned int 4294967295, const char * 0x00000000, unsigned long 0) line 1082
    CMnCourseSalaDlg::OnInitDialog() line 55 + 29 bytes
    AfxDlgProc(HWND__ * 0x000d05d8, unsigned int 272, unsigned int 1050182, unsigned int 1050182) line 35 + 14 bytes
    CString::AllocBeforeWrite(int 0) line 197 + 8 bytes
    CString::AssignCopy(int 0, const char * 0x00000000) line 315
    CString::operator=(const char * 0x00000000) line 346
    CRecordset::SetState(int -1, const char * 0x00000000, unsigned long 0) line 2268
    CRecordset::Open(unsigned int 4294967295, const char * 0x00000000, unsigned long 0) line 1082
    CLoginDlg::OnInitDialog() line 80 + 23 bytes
    代码如下:
    BOOL CMnCourseSalaDlg::OnInitDialog() 
    {
    CDialog::OnInitDialog();

    // TODO: Add extra initialization here
    if (m_CourseSalaSet.IsOpen()) 
    {
    m_CourseSalaSet.Close();
    }
    m_CourseSalaSet.Open();//此时,出现断言错误

    }
    太奇怪了,为什么????
      

  7.   

    试试明确给定sql语句吧,不知道你的缺省sql语句是什么。
      

  8.   

    我rebuildall解决问题,但是还不清楚具体原因