lujl03
lujl03
2015-08-10 00:43

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

  • 对话框
  • 界面
  • mfc
  • 数据库
  • visual studio

用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条回答

为你推荐