MFC用ODBC连接数据库,具体应该在程序的什么位置进行连接和关闭?解决思路

MFC用ODBC连接数据库,具体应该在程序的什么位置进行连接和关闭?
我设计一个登陆界面,输入账号密码正确后进入其他界面,从其他界面注销到登陆界面再次输入账号密码就会发生异常,
有时候在登陆界面输入账号密码次数多了也会发生异常。程序会断在DBclose和connet函数的位置上,请问该如何解决这样的问题?

我的代码:
登陆
C/C++ code

if ( m_dbProcess->CanLogin(m_strUserName.GetBuffer(m_strUserName.GetLength() + 1), 
        m_strPassWord.GetBuffer(m_strPassWord.GetLength() + 1)) == TRUE ){
          //登陆,m_dbProcess是CDatabase对象
}



判断登陆账号密码合法性:
C/C++ code
BOOL CDBProcess::CanLogin(char *strUserName, char *strPassWord)
{
    STAFF st[20];
    CString sql("select * from STAFF");
    BOOL bSucc = Select(sql, st, 20);  // Select是一个自定义函数,在下面已列出

    if ( bSucc == TRUE ){
        for ( int i = 0; i < 20; i++ ){
            trim(st[i].username);
            trim(st[i].password);
            if ( strcmp(strUserName, st[i].username) == 0 && strcmp(strPassWord, st[i].password) == 0 ){
                m_strUserName = strUserName;
                return TRUE;
            }
        }
    }
    return FALSE;
}



select函数:
C/C++ code
BOOL CDBProcess::Select(CString sql, STAFF * st, int nSt)
{
    connect();
    CStaffRecordset rs(&m_db);
    BOOL bRtn = FALSE;

    try {
        bRtn = rs.Open(CRecordset::snapshot,sql);
    } catch(CDBException *pDBEx) {
        pDBEx->ReportError();
    } catch(CMemoryException *pMemEx) {
        pMemEx->ReportError();
    }

    if(!bRtn) {
        return FALSE;
    }

    int i = 0;
    while( !rs.IsEOF() ){
        strcpy(st[i].username, rs.USERNAME);
        strcpy(st[i].chnname, rs.CHN_NAME);
        strcpy(st[i].password, rs.PASSWORD);
        strcpy(st[i].st_date, rs.ST_DATE);
        strcpy(st[i].limit, rs.LIMIT);
        strcpy(st[i].createname, rs.CREATE_NAME);
        i++;
        rs.MoveNext();
    }

    rs.Close();
    DBClose();
    return TRUE;
}




数据库连接与关闭:
C/C++ code
BOOL CDBProcess::connect()
{
    BOOL bRtn = FALSE;
    try {
        bRtn = m_db.Open("DBIMS");
    } catch (CDBException *pDBEx) {
        pDBEx->ReportError();
    } catch (CMemoryException *pMemEx) {
        pMemEx->ReportError();
    }
    if (!bRtn) {
        return FALSE;
    }
    return TRUE;
}

void CDBProcess::DBClose()
{
    m_db.Close();
}


请问我的连接和关闭的位置有问题吗? 具体该怎么做?

------解决方案--------------------
首先:用CString::GetBufer后记着要调用ReleaseBuffer()

其次:在connect()中先调用Close()后再Open();

最后:先把调用Select()函数的地方注释掉试,如果还是不行的话,那再把程序简化去找原因,楼主可以看Call stack,这样不是很好找到原因吗?
------解决方案--------------------
探讨
首先:用CString::GetBufer后记着要调用ReleaseBuffer()

其次:在connect()中先调用Close()后再Open();

最后:先把调用Select()函数的地方注释掉试,如果还是不行的话,那再把程序简化去找原因,楼主可以看Call stack,这样不是很好找到原因吗?