// LoginDlg.cpp : implementation file
//#include "stdafx.h"
#include "超市收银管理系统.h"
#include "LoginDlg.h"#include "LoginDlgSet.h"#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//#import "c:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF", "adoEOF");
/////////////////////////////////////////////////////////////////////////////
// CLoginDlg dialog
extern CDatabase m_database; 
extern CString m_ID; 
extern loginusertype;CLoginDlg::CLoginDlg(CWnd* pParent /*=NULL*/)
: CDialog(CLoginDlg::IDD, pParent)
{
  count=0;
//{{AFX_DATA_INIT(CLoginDlg)
m_userpassword = _T("");
m_userID = _T("");
m_usertype = _T("");
//}}AFX_DATA_INIT
}
void CLoginDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CLoginDlg)
DDX_Text(pDX, IDC_EDIT_USER_PASSWORD, m_userpassword);
DDX_Text(pDX, IDC_EDIT_USER_NAME, m_userID);
DDX_CBString(pDX, IDC_COMBO, m_usertype);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CLoginDlg, CDialog)
//{{AFX_MSG_MAP(CLoginDlg)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
// CLoginDlg message handlersvoid CLoginDlg::OnOK() 
{
// TODO: Add extra validation here
//先设置为未登陆状态
BOOL bLogin=FALSE; CLoginDlgSet * m_recordset=new CLoginDlgSet(&m_database);
CString strSQL; //读入用户输入的信息
UpdateData(TRUE); int type=1;
if(m_usertype.Compare("收银员")==0)
type=1;
else
if(m_usertype.Compare("管理员")==0)
type=2;//测试数据库是否打开

if(!m_database.IsOpen()) 

if(!m_database.Open(_T("ODBC;DSN=超市收银管理系统")))
{
MessageBox( "数据库未打开 "); 
exit(0);
}
}
//查询是否有匹配的用户
/* 所有在使用ODBC操作数据库时,需要注意:
对于不返回结果集的SQL语句,我们应该使用CDatabase::ExecuteSQL()来执行,如:删除(DELETE),插入(INSERT),更新(UPDATE). 
对于需要返回结果集的SQL语句,我们需要使用CRecordSet::Open()方法来执行,如:查询(SELECT)。*/ strSQL.Format("select * from USER where USERS_ID='%s' AND USER_PASSWORD='%s' AND USER_TYPE=%d",m_userID,m_userpassword,type);

//Open(LPCTSTR lpszDSN, BOOL bExclusive = FALSE,
//BOOL bReadonly = FALSE, LPCTSTR lpszConnect = _T("ODBC;"),
//BOOL bUseCursorLib = TRUE);
//m_database.ExecuteSQL(strSQL);
 m_recordset->Open(CRecordset::forwardOnly,strSQL,CRecordset::readOnly);
//m_recordset->Open(AFX_DB_USE_DEFAULT_TYPE,strSQL,false);
//若查询结果为空
// m_database.get if(m_recordset->GetRecordCount()==0)
{
if(count<3)
{
MessageBox("用户名或密码不正确!");
    count++;
}
else
{
MessageBox("错误次数达三次以上!","本窗口将关闭!");
EndDialog(IDCANCEL);
}
} //成功登陆
else
{

while( !m_recordset->IsEOF())//IsEOF()
{ m_recordset->GetFieldValue("USERS_ID",m_ID);// ???????????问题出现在这里,现在程序执行到这里就不在向下执行了  求大神解决??????????
     MessageBox("4","",MB_OK);
m_recordset->MoveNext();
bLogin=TRUE;
loginusertype=type;
}
}

//若登陆成功,返回主框架IDOK
if(bLogin)
{
MessageBox("欢迎登陆超市收银管理系统");
EndDialog(IDOK);
}
else
m_database.Close();
return;



// CDialog::OnOK();
}

解决方案 »

  1.   

    看看需不需加上这一句:
    m_recordset->MoveFirst();
    函数不知道对不对,就是这个意思
      

  2.   

    ADO记录集一般使用下面方法去数据:
    m_recordset->Fields->GetItem("fieldname")->Value;
      

  3.   

    不能直接传标准类型,像这样
    CDBVariant varValue_ID;
    m_recordset->GetFieldValue("USERS_ID",varValue_ID);
    m_ID= varValue_ID.m_iVal;
      

  4.   

     
    void GetFieldValue( 
       LPCTSTR lpszName, 
       CDBVariant& varValue, 
       short nFieldType = DEFAULT_FIELD_TYPE  
    );
    void GetFieldValue( 
       short nIndex, 
       CDBVariant& varValue, 
       short nFieldType = DEFAULT_FIELD_TYPE  
    );
    void GetFieldValue(
       short nIndex,
       CStringA& strValue 
    );
    void GetFieldValue(
       short nIndex,
       CStringW& strValue 
    );
     
    MSDN 看这个 CRecordset 怎么使用 
      

  5.   

    2楼说的对。楼主的编程风格很囧。  #include "超市收银管理系统.h"
    extern CDatabase m_database;  
    extern CString m_ID;  
    extern loginusertype;
    CLoginDlg::CLoginDlg(CWnd* pParent /*=NULL*/)
    : CDialog(CLoginDlg::IDD, pParent)
    {
      count=0;
    }