问题描述
- 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%复现。
请问各位达人,这是怎么回事?有何解决办法?
解决方案
应该是你登陆对话框没有处理好回车按钮,导致对话框关闭了,对话框缺省是可以回车关闭的,你需要自己处理,让对话框不关闭
解决方案二:
用回车方式登录,是不是触发了默认生成的ON_OK消息?