首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

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

2012-02-14 
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,这样不是很好找到原因吗?

热点排行