VS2010 MFC登录对话框打开数据库失败后意外出现主界面的问题

用VS2010 MFC建立了一个主界面为对话框的函数,要求需要登录对话框,且通过读取数据库来校验用户,代码如下:
BOOL CManagementDlg::OnInitDialog()//主对话框初始函数
{
CDialogEx::OnInitDialog();

_CLogInDlg dlgLogin;
if(dlgLogin.DoModal() != IDOK)//登录对话框
{
    OnOK();
    return TRUE;
}_

// 将“关于...”菜单项添加到系统菜单中。

// IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
    BOOL bNameValid;
    CString strAboutMenu;
    bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
    ASSERT(bNameValid);
    if (!strAboutMenu.IsEmpty())
    {
        pSysMenu->AppendMenu(MF_SEPARATOR);
        pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
    }
}

// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
//  执行此操作
SetIcon(m_hIcon, TRUE);         // 设置大图标
SetIcon(m_hIcon, FALSE);        // 设置小图标

ShowWindow(SW_MAXIMIZE);

// TODO: 在此添加额外的初始化代码

return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE

}

登录对话框响应登录按钮的代码如下:
void CLogInDlg::OnClickedButtonLogin()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
if(m_strLogUser.GetLength() == 0)
{
MessageBox(_T("请输入用户名!"));
return;
}
CManagementDlg *pdlgMain = (CManagementDlg *)theApp.m_pMainWnd;
CString strDataSource;
CString strInitCatalog;
CString strUser;
CString strPassword;
CString strTableName = _T(TABLE_NAME_STAFF);
CAdoDBControl myAdoControl;//对象声明
CString strShow;
UINT iGet = 0;
iGet = CAdoDBControl::GetDbCfgFromIniFile();
if(iGet & INI_USERID_MISSING)
{
strShow.Format(_T("配置文件%s中未找到数据库用户名"), _T(INI_FILE_NAME));
MessageBox(strShow);
return;
}
if(iGet & INI_PWD_MISSING)
{
strShow.Format(_T("配置文件%s中未找到数据库用户密码"), _T(INI_FILE_NAME));
MessageBox(strShow);
return;
}
if(iGet & INI_DATASOURCE_MISSING)
{
strShow.Format(_T("配置文件%s中未找到数据库主机名"), _T(INI_FILE_NAME));
MessageBox(strShow);
return;
}
if(iGet & INI_INITCATALOG_MISSING)
{
strShow.Format(_T("配置文件%s中未找到数据库名"), _T(INI_FILE_NAME));
MessageBox(strShow);
return;
}
if(iGet & INI_FILE_MISSING)
{
strShow.Format(_T("配置文件%s未找到"), _T(INI_FILE_NAME));
MessageBox(strShow);
return;
}
CAdoDBControl::GetDbCfg(strUser, strPassword, strDataSource, strInitCatalog);
CString strSql;
strSql.Format(_T("Provider=SQLOLEDB.1;Data Source=%s;User ID=%s;Password=%s;Initial Catalog=%s;Persist Security Info=FALSE"),

strDataSource, strUser, strPassword, strInitCatalog);
int iResult = myAdoControl.Open(strSql.AllocSysString(), adModeUnknown);
if(ADO_DB_SUCCESSFUL != iResult)
{
return;
}

strSql.Format(_T("SELECT * FROM %s WHERE 用户名='%s'"), strTableName, m_strLogUser);
vector> vSelectResult = myAdoControl.Select(strSql.AllocSysString());

myAdoControl.Close();

int iFindNumber = vSelectResult.size();
if(iFindNumber < 1)
{
    CString strMsg;
    strMsg.Format(_T("用户%s不存在"), m_strLogUser);
    MessageBox(strMsg);
    return;
}

_variant_t vUser = vSelectResult[0][STAFF_USERNAME_COLUMN];
_variant_t vPwd = vSelectResult[0][STAFF_PASSWORD_COLUMN];
CString strUserFromSql = (LPCTSTR)_bstr_t(vUser);
CString strPwdFromSql = (LPCTSTR)_bstr_t(vPwd);     
if((!strUserFromSql.CompareNoCase(m_strLogUser)) && (strPwdFromSql == m_strLogPwd))
{
    pdlgMain->m_stCurUser.m_strUserName = strUserFromSql;
    _variant_t vElement = vSelectResult[0][STAFF_NO_COLUMN];
    pdlgMain->m_stCurUser.m_strStaffNo = (LPCTSTR)_bstr_t(vElement);
    vElement = vSelectResult[0][STAFF_REALNAME_COLUMN];
    pdlgMain->m_stCurUser.m_strRealName = (LPCTSTR)_bstr_t(vElement);
    vElement = vSelectResult[0][STAFF_AUTHORITY_COLUMN];
    pdlgMain->m_stCurUser.m_strAuthority = (LPCTSTR)_bstr_t(vElement);
    OnOK();
}   
else
{
    MessageBox(_T("密码错误"));
}

}
为了使按回车键和点击登录按钮的功能一样,添加如下代码:
BOOL CLogInDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: 在此添加专用代码和/或调用基类
if(WM_KEYDOWN == pMsg->message)
{
if(VK_RETURN == pMsg->wParam)
{
OnClickedButtonLogin();
return FALSE;
}
}

return CDialogEx::PreTranslateMessage(pMsg);

}

打开数据库的代码如下:
int CAdoDBControl::Open(BSTR ConnectionString, long Options )
{
if( FAILED( m_pConnection.CreateInstance(__uuidof(Connection)) ) ) //初始化Connection指针
{
return ADO_DB_CREATE_FAIL;
}
try
{
m_pConnection->Open(ConnectionString, "", "", Options);
}
catch(_com_error e)
{
AfxMessageBox(e.Description());
return ADO_DB_OPEN_FAIL;
}
return ADO_DB_SUCCESSFUL;
}

运行函数时,故意将数据库配置写错,在填写完用户名和密码后点击登录按钮,那么约10秒以后,程序报错“[DBNETLIB][ConnectionOpen (Connect()).]SQL Server

不存在或拒绝访问。”,点击确定后,返回登录对话框。重复多次操作,依然如此。程序此时是正常的。
但是,如果在填写完用户名和密码后,用回车方式登录,此时依然报错“[DBNETLIB][ConnectionOpen (Connect()).]SQL Server不存在或拒绝访问。”,但是在点击

确定后,登录对话框会消失,并且弹出主界面,且主界面不响应鼠标点击任何按钮,且主界面不是我想要的主界面(比如正常登录的主界面是最大化的,而此时出现

的主界面不是最大化的),此问题100%复现。
请问各位达人,这是怎么回事?有何解决办法?

2个回答

应该是你登陆对话框没有处理好回车按钮,导致对话框关闭了,对话框缺省是可以回车关闭的,你需要自己处理,让对话框不关闭

lujl03
lujl03 回复oyljerry: 在函数OnClickedButtonLogin()中由于Open失败返回后,没有执行OnClickedButtonLogin后面的那条return FALSE语句,不知道跳到哪里去了。
4 年多之前 回复
oyljerry
oyljerry 回复lujl03: 那你调试一下,看按了回车以后,程序发生了什么,对话框怎么消失了
4 年多之前 回复
lujl03
lujl03 if(VK_RETURN == pMsg->wParam) OnClickedButtonLogin(); return FALSE;
4 年多之前 回复
lujl03
lujl03 if(WM_KEYDOWN == pMsg->message)
4 年多之前 回复
lujl03
lujl03 BOOL CLogInDlg::PreTranslateMessage(MSG* pMsg)
4 年多之前 回复
lujl03
lujl03 我处理了回车键的,这就是我处理回车键的代码:
4 年多之前 回复

用回车方式登录,是不是触发了默认生成的ON_OK消息?

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问