MFC用ODBC连接数据库,具体应该在程序的什么位置进行连接和关闭?解决思路
MFC用ODBC连接数据库,具体应该在程序的什么位置进行连接和关闭?
我设计一个登陆界面,输入账号密码正确后进入其他界面,从其他界面注销到登陆界面再次输入账号密码就会发生异常,
有时候在登陆界面输入账号密码次数多了也会发生异常。程序会断在DBclose和connet函数的位置上,请问该如何解决这样的问题?
我的代码:
登陆
判断登陆账号密码合法性:
select函数:
数据库连接与关闭:
请问我的连接和关闭的位置有问题吗? 具体该怎么做?
------解决方案--------------------
首先:用CString::GetBufer后记着要调用ReleaseBuffer()
其次:在connect()中先调用Close()后再Open();
最后:先把调用Select()函数的地方注释掉试,如果还是不行的话,那再把程序简化去找原因,楼主可以看Call stack,这样不是很好找到原因吗?
------解决方案--------------------
我设计一个登陆界面,输入账号密码正确后进入其他界面,从其他界面注销到登陆界面再次输入账号密码就会发生异常,
有时候在登陆界面输入账号密码次数多了也会发生异常。程序会断在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,这样不是很好找到原因吗?
------解决方案--------------------