oracle8i/9i +VC6.0+odbc 多线程 
程序运行一段时间后,就会弹出该Assert失败的问题,请问高手如何解决?
在线等!

解决方案 »

  1.   

    BOOL CDatabase::BeginTrans()
    {
    ASSERT_VALID(this);
    ASSERT(m_hdbc != SQL_NULL_HDBC); if (!m_bTransactions)
    return FALSE; // Only 1 level of transactions supported
    #ifdef _DEBUG
    ASSERT(!m_bTransactionPending);//这里
    #endif RETCODE nRetCode;
    AFX_SQL_SYNC(::SQLSetConnectOption(m_hdbc, SQL_AUTOCOMMIT,
    SQL_AUTOCOMMIT_OFF));
    DEBUG_ONLY(m_bTransactionPending = TRUE); return Check(nRetCode);
    }
    //上面是MFC中的源代码。可见在你的程序中m_bTransactionPending此时的值为TRUE。这是不正确的!!而对其赋值的只有这个函数中的:
    DEBUG_ONLY(m_bTransactionPending = TRUE);
    可见可能是处理同步的原因导致的!
      

  2.   

    多谢,但如何解决这样的问题呢?难道在数据库的每次begintrans都要加上保护机制吗?这样的话,在同 一个时间内就只能有一个事务了,对吗?
      

  3.   

    Searching for 'm_bTransactionPending'...
    F:\VCÔ´Âë²Î¿¼\MFC\Include\AFXDB.H(283): BOOL m_bTransactionPending;
    F:\VCÔ´Âë²Î¿¼\MFC\SRC\DBCORE.CPP(208): DEBUG_ONLY(m_bTransactionPending = FALSE);
    F:\VCÔ´Âë²Î¿¼\MFC\SRC\DBCORE.CPP(490): ASSERT(!m_bTransactionPending);
    F:\VCÔ´Âë²Î¿¼\MFC\SRC\DBCORE.CPP(496): DEBUG_ONLY(m_bTransactionPending = TRUE);
    F:\VCÔ´Âë²Î¿¼\MFC\SRC\DBCORE.CPP(511): ASSERT(m_bTransactionPending);
    F:\VCÔ´Âë²Î¿¼\MFC\SRC\DBCORE.CPP(522): DEBUG_ONLY(m_bTransactionPending = FALSE);
    F:\VCÔ´Âë²Î¿¼\MFC\SRC\DBCORE.CPP(537): ASSERT(m_bTransactionPending);
    F:\VCÔ´Âë²Î¿¼\MFC\SRC\DBCORE.CPP(548): DEBUG_ONLY(m_bTransactionPending = FALSE);
    F:\VC&Ocirc;&acute;&Acirc;&euml;&sup2;&Icirc;&iquest;&frac14;\MFC\SRC\DBCORE.CPP(926): dc << "\nm_bTransactionPending = " << m_bTransactionPending;
    9 occurrence(s) have been found.
    先顶一次
      

  4.   

    Searching for 'm_bTransactionPending'...
    F:\VC源码\MFC\Include\AFXDB.H(283): BOOL m_bTransactionPending;
    F:\VC源码\MFC\SRC\DBCORE.CPP(208): DEBUG_ONLY(m_bTransactionPending = FALSE);
    F:\VC源码\MFC\SRC\DBCORE.CPP(490): ASSERT(!m_bTransactionPending);
    F:\VC源码\MFC\SRC\DBCORE.CPP(496): DEBUG_ONLY(m_bTransactionPending = TRUE);
    F:\VC源码\MFC\SRC\DBCORE.CPP(511): ASSERT(m_bTransactionPending);
    F:\VC源码\MFC\SRC\DBCORE.CPP(522): DEBUG_ONLY(m_bTransactionPending = FALSE);
    F:\VC源码\MFC\SRC\DBCORE.CPP(537): ASSERT(m_bTransactionPending);
    F:\VC源码\MFC\SRC\DBCORE.CPP(548): DEBUG_ONLY(m_bTransactionPending = FALSE);
    F:\VC源码\MFC\SRC\DBCORE.CPP(926): dc << "\nm_bTransactionPending = " << m_bTransactionPending;
    9 occurrence(s) have been found.
    为 m_bTransactionPending 置 FALSE 的位置位于 BeginTrans,因此最根本的办法只有使用线程同步