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

问题描述

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消息?

时间: 2024-11-08 20:37:23

visual studio 2010-VS2010 MFC登录对话框打开数据库失败后意外出现主界面的问题的相关文章

Visual Studio 2010用户界面的重要升级

Visual Studio已经通过"Visual Studio 2010 Pro Power Tool"工具插件进行了重要的用 户界面升级.除了最终修复"Add References"(增加参考)对话框之外,主要的修改是他们称 作"Document Well 2010 Plus"的功能.这个功能显著改变了在文件窗口处理标签的方式. 这个新的"Add References"对话框的外观与原来的对话框完全不同.在默认状态下,这个

使用IntelliTrace在Visual Studio 2010中调试.NET应用程序

在Visual Stuido 2010中有一个新的功能那就是IntelliTrace.IntelliTrace被引入到Visula Studio中来加速我们对.NET应用程序的调试,它通过对预先设置的事件和方法在运行过程中的跟踪并将其有效地传递给调试执行者,从而快速的传递程序在执行过程中的状态和各种信息来帮助开发者更好的调试程序,快速的发现问题.实际上,在Visual Studio 2010之前,Microsoft Visual Stuido已经帮助我们很好的继承了调试工具,比如对变量的监控,对

Visual Studio 2010 Ultimate 试用版 官网上文件2是坏的?

问题描述 下载安装 Visual Studio 2010 Ultimate 试用版 从官方地址安装后 解压成ISO 文件的时候 显示文件2错误!各位谁又谁有正确的文件 发下给我谢了.!http://www.microsoft.com/downloads/zh-cn/details.aspx?familyid=06a32b1c-80e9-41df-ba0c-79d56cb823f7&displaylang=zh-cn 问题补充:asyty 写道 解决方案 个人认为99.9%的可能性是你下载出问题了

用Microsoft visual studio 2010新建C#项目后无法打开

问题描述 用Microsoft visual studio 2010新建C#项目后无法打开 用Microsoft visual studio 2010新建C#项目后无法打开系统提示""不允许所请求的注册表访问权""如何能打开

vs2010 文件读写-visual studio 2010 随机生成5个10以内的加法式,为何生成1个式子就跳回编程页面,需要重新运行才行

问题描述 visual studio 2010 随机生成5个10以内的加法式,为何生成1个式子就跳回编程页面,需要重新运行才行 #include #include #include void main() { int a,b; srand(time(0)); a=rand()%10; b=rand()%10; printf("%d+%d=n",a,b); } 解决方案 没有写循环,只随机了一次 解决方案二: 从哪里可以看出来是五个呢

配置Visual Studio 2010开发环境

Visual Studio 2010是一个强大的IDE,微软的主要编程语言都包含于其中,不管是做桌面软件,还是做Web应用,使用Visual Studio 2010都可以搞定. 安装好Visual Studio 2010简体中文专业版之后,您可以根据自己的需求来配置Visual Studio 2010的开发环境. 比如我经常要用C#,所以这里我们把VS2010配置为"Visual C# 开发设置". 配置方法很简单:第一次打开Visual Studio 2010的时候,会弹出一个&qu

在 Visual Studio 2010 中开发和部署 Windows Azure 应用程序

原文 在 Visual Studio 2010 中开发和部署 Windows Azure 应用程序 在 Visual Studio 2010 中开发和部署 Windows Azure 应用程序 Jim Nakashima.Hani Atassi 和 Danny Thorpe 将应用程序或服务部署到 Microsoft 云服务平台 Windows Azure 的原因有很多.例如,只为使用的内容付费从而可降低操作和硬件成本.构建几乎能无限缩放的应用程序.巨大的存储容量.地理位置等等,不胜枚举. 只有

Visual Studio 2010 实用功能总结

Visual Studio 2010 实用功能总结   Visual Studio 2010 已经发布1个多月了,个人感觉在使用过程中有些新功能确实方便了很多.在此分享一些比较实用的功能,也算是抛砖引玉欢迎大家来补充其他自己常用的功能特性. 起始页面 在近期项目列表中可以将一些正在开发或重要的项目Pin在列表中以方便下次使用.                           也可以右键项目名称打开项目所在文件夹.   分屏显示      本次VS2010 使用WPF 进行了大量Shell 开

微软Visual Studio 2010正式发布

4月12日上午,北京融京国际酒店,微软新一代开发平台Visual Studio 2010正式发布.千位中国开发菁英与世界五大城市同步迎接跨世代开发工具!微软全球资深副总裁张亚勤博士,微软大中华区开发工具及平台事业部总经理谢恩伟,微软Visual Studio商业软件部.微软亚太研发集团服务器与开发工具事业部(中国)总经理潘正磊等多位微软高层,以及来自微软总部的多位核心研发团队主管,亲临发布会现场,共同为IT专业人士解密微软新一代开发平台的革新之处. Visual Studio 2010多项革新性